{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# SciPy - Library of scientific algorithms for Python\n",
    "\n",
    "J.R. Johansson (robert@riken.jp) http://dml.riken.jp/~rob/\n",
    "\n",
    "The latest version of this [IPython notebook](http://ipython.org/notebook.html) lecture is available at [http://github.com/jrjohansson/scientific-python-lectures](http://github.com/jrjohansson/scientific-python-lectures).\n",
    "\n",
    "The other notebooks in this lecture series are indexed at [http://jrjohansson.github.com](http://jrjohansson.github.com)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# what is this line all about? Answer in lecture 4\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Introduction\n",
    "\n",
    "The SciPy framework builds on top of the low-level NumPy framework for multidimensional arrays, and provides a large number of higher-level scientific algorithms. Some of the topics that SciPy covers are:\n",
    "\n",
    "* Special functions ([scipy.special](http://docs.scipy.org/doc/scipy/reference/special.html))\n",
    "* Integration ([scipy.integrate](http://docs.scipy.org/doc/scipy/reference/integrate.html))\n",
    "* Optimization ([scipy.optimize](http://docs.scipy.org/doc/scipy/reference/optimize.html))\n",
    "* Interpolation ([scipy.interpolate](http://docs.scipy.org/doc/scipy/reference/interpolate.html))\n",
    "* Fourier Transforms ([scipy.fftpack](http://docs.scipy.org/doc/scipy/reference/fftpack.html))\n",
    "* Signal Processing ([scipy.signal](http://docs.scipy.org/doc/scipy/reference/signal.html))\n",
    "* Linear Algebra ([scipy.linalg](http://docs.scipy.org/doc/scipy/reference/linalg.html))\n",
    "* Sparse Eigenvalue Problems ([scipy.sparse](http://docs.scipy.org/doc/scipy/reference/sparse.html))\n",
    "* Statistics ([scipy.stats](http://docs.scipy.org/doc/scipy/reference/stats.html))\n",
    "* Multi-dimensional image processing ([scipy.ndimage](http://docs.scipy.org/doc/scipy/reference/ndimage.html))\n",
    "* File IO ([scipy.io](http://docs.scipy.org/doc/scipy/reference/io.html))\n",
    "\n",
    "Each of these submodules provides a number of functions and classes that can be used to solve problems in their respective topics.\n",
    "\n",
    "In this lecture we will look at how to use some of these subpackages.\n",
    "\n",
    "To access the SciPy package in a Python program, we start by importing everything from the `scipy` module."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy import *"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we only need to use part of the SciPy framework we can selectively include only those modules we are interested in. For example, to include the linear algebra package under the name `la`, we can do:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "import scipy.linalg as la"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Special functions\n",
    "\n",
    "A large number of mathematical special functions are important for many computional physics problems. SciPy provides implementations of a very extensive set of special functions. For details, see the list of functions in the reference documention at http://docs.scipy.org/doc/scipy/reference/special.html#module-scipy.special. \n",
    "\n",
    "To demonstrate the typical usage of special functions we will look in more detail at the Bessel functions:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "#\n",
    "# The scipy.special module includes a large number of Bessel-functions\n",
    "# Here we will use the functions jn and yn, which are the Bessel functions \n",
    "# of the first and second kind and real-valued order. We also include the \n",
    "# function jn_zeros and yn_zeros that gives the zeroes of the functions jn\n",
    "# and yn.\n",
    "#\n",
    "from scipy.special import jn, yn, jn_zeros, yn_zeros"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "J_0(0.000000) = 1.000000\n",
      "Y_0(1.000000) = 0.088257\n"
     ]
    }
   ],
   "source": [
    "n = 0    # order\n",
    "x = 0.0\n",
    "\n",
    "# Bessel function of first kind\n",
    "print (\"J_%d(%f) = %f\" % (n, x, jn(n, x)))\n",
    "\n",
    "x = 1.0\n",
    "# Bessel function of second kind\n",
    "print (\"Y_%d(%f) = %f\" % (n, x, yn(n, x)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX8AAAD7CAYAAACCEpQdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXl8TNf7xz8jidiFiEQQsRWx09I1llha0VKqlmrVVi3a\n0lb5/qq0Si2NqLVRWnvVGsQeBNkQQRKRRWSTnezJZJmZ+/z+OKIimWRmcmfuRM779ZoXM/fcc565\nST733HOeRUZE4HA4HE7NopbUBnA4HA7H8HDx53A4nBoIF38Oh8OpgXDx53A4nBoIF38Oh8OpgXDx\n53A4nBqIqdQGPI9MJuO+pxwOh6MlRCTTpr1RzvyJiL+IsHTpUsltMIYXvw78WvBrUfFLF4xS/Dkc\nDoejX7j4czgcTg2Ei78RM3DgQKlNMAr4dfgPfi3+g1+LqiHTdb1IX8hkMjI2mzgcDseYkclkIC03\nfI3O24fD4dRs7O3tERcXJ7UZRkmbNm0QGxsrSl985s/hcIyKJ7NYqc0wStRdG11m/nzNn8PhcGog\nXPw5HA6nBsLFn8PhcGogXPw5HA6nBsLFn8PhcGogXPw5HA5Hz8TExEhtQhm4+HM4HI4eiYmJwfXr\n1yttFx8fjwMHDhjAIgYXfw6Hw9Ejbm5umDBhQqXt7OzsIJfLce/ePQNYxcWfw+FwdGb//v0YOXIk\n+vfvD19f3zLHg4OD0bp1a437mzRpEjZt2iSmiWrh4s/hcDg6MnHiRDRs2BDz58/HG2+8Uea4h4cH\nBg0apHF/5ubmKC4uRl5enphmlgsXfw6Hw6kCXl5eagU+ICAADg4OWvXXs2dP+Pn5iWFahfDEbhwO\np1oh0yqDjXrESB8UFBQEKysrWFtbl3u8oKAAsucMPnHiBExMTODt7Y3u3bvj7NmzWLx4MTp16gQA\nsLW1xf379zFs2LCqG1gBosz8ZTLZXzKZLFUmkwVX0GaDTCa7L5PJ7shksl5ijMvhcGoeROK8xODi\nxYtwcnJCZmYmVq9ejZ07dyIwMPDpcZVKVap9fHw8HBwc4OzsDE9PTzg7O2PChAmws7N72sbCwgI5\nOTniGFgBYi377AAwXN1BmUz2DoD2RNQRwCwAbiKNy+FwOJJx4cIFODk5YefOnRg0aBAmT54MV1fX\np8dNTUsvrtjZ2aFDhw5IS0tDo0aNYGFhAWdnZ9StW/dpm4KCAtSvX1/vtosi/kTkAyCzgiajAOx+\n0vY6gMYymaz85yQOh8MxUgoLC2Fra4vo6GikpKQgNDQUTk5OiI6ORosWLWBqaorMzP+k0NraGvn5\n+U/fh4eHIygoCKdPn4ajoyMA4OTJk6XGyMjIgI2Njd6/i6E2fFsCePjM+8Qnn3E4HE61wczMDLNn\nz0ZISAhcXV1x9uxZ1KtXD4IgwMTEpEz7AQMGlArwOn/+PE6dOgUiQmFhIY4dO1ZmvyA4OLhczyGx\nMcoN37p1f0KDBoC1NTBy5EB8/fVAtGghtVUcDqemY2JigsWLFwMARo0a9fTzzp07Iy0tDZaWlmjc\nuPHTz99//324uLhg8ODBAICvvvqq0jGysrLQsmXFc+PLly/j8uXLOnyD/xCtkpdMJmsDwIOIepRz\nzA2AFxEdePI+HMAAIkotpy2lpRGSk4GAAODsWeDiRaB9e2DePGD8eMDUKG9ZHA5HDKpjJa/09HT8\n/fffsLCwQLdu3fDaa689Pebq6oopU6bA0tKy0n4CAgIQHR2N8ePHl3tczEpeYoq/PZj4dy/n2AgA\nc4jIWSaTvQrgdyJ6VU0/Zco4KpXAuXPAb78BsbHAt98Cn30GmJuLYjqHwzEiqqP4V4QgCNi2bRtm\nzZpVYTuVSgUXFxcsXLhQbRujE3+ZTPYPgIEALAGkAlgKoDYAIqI/n7TZBOBtAPkAphLRLTV9VVjD\n9/p14JdfgAcPgO3bAQMsjXE4HAPyoom/pqSkpKBx48alPH+ex+jEX0w0KeBOBBw9Cnz5JTBmDLBy\nJdCwoYEM5HA4eqWmir8m1PgC7jIZMHYsEBoKyOXAyy8DERFSW8XhcDjVh2op/iU0aQL8/TewcCHg\n6AicOSO1RRwOh1M9qJbLPuXh6wuMG8c2g7/5Rrz8HxwOx7DwZR/11Pg1f3XExwMjRgCjR7NNYX4D\n4HCqH1z81SOm+L9QHvN2doCXF+DkBAgCsGIFvwFwOBxOebxQ4g8AVlbApUvAkCGASgWsWsVvABwO\nh/M81XrDVx3NmrGoYE9P4OefpbaGw+FwjI8XbuZfgqUl8/557TXA3h749FOpLeJwOBzj4YWc+Zdg\nbQ2cPs1cQS9elNoaDodTU4mJiZHahDK80OIPAJ07AwcPAhMnAnfvSm0Nh8OpacTExJRK66yO+Ph4\nHDhwwAAWMV548QeAAQOAdeuAd98FMjKktobD4dQk3NzcMGHChErb2dnZQS6X4969ewawqoaIPwB8\n9BHz/58yhbmBcjgcTlXZv38/Ro4cif79+8PX17fM8eDgYLRu3Vrj/iZNmoRNmzaJaaJaaoz4A8Dq\n1UB6OrBmjdSWcDicF4GJEyeiYcOGmD9/frnVtzw8PDBo0CCN+zM3N0dxcTHy8vLENLNcXqgIX01I\nSABeeQX45x9Ai58Jh8MxEJVF+Mp+Fidwh5aKozM2NjYICgoqU44RAEaPHg13d3fItAg22rhxIzp1\n6oRhw4aVOcYjfKtAq1bA7t1sGejWLcAAdZI5HI6IiCXaYhAUFAQrK6tyhR8ACgoKygj/iRMnYGJi\nAm9vb3Tv3h1nz57F4sWL0alTJwCAra0t7t+/X674i0mNWvYpYehQYOpUYOZMVhuAw+FwdOHixYtw\ncnJCTk4Ojh49ipUrV5Y6rlKpSr2Pj4+Hg4MDnJ2d4enpCWdnZ0yYMAF2dnZP21hYWCAnJ0fvttdI\n8QeApUuBxETgr7+ktoTD4VRXLly4ACcnJzRq1Ah9+/aFQqEoddz0uYLjdnZ26NChA9LS0tCoUSNY\nWFjA2dm5VPWugoIC1K9fX++211jxr10b2LMH+N//gOhoqa3hcDjVgcLCQtja2iI6OhopKSkIDQ2F\nk5OT2vbW1tbIz89/+j48PBxBQUE4ffo0HB0dAQAnT54sdU5GRgZsDLAeXWPFHwC6dgUWLQI++YQl\ngeNwOJyKMDMzw+zZsxESEgJXV1ecOXMG9erVU9t+wIABpQK8zp8/j1OnToGIUFhYiGPHjpXZLwgO\nDi7Xc0hsapy3z/MIAjB4MODsDCxYYLBhORyOGqprPv+4uDjs3LkTS5cuffpZZmYmXFxcsGLFCo37\nmTFjBrZv317usRpfw1dMatVipSBXrwYePJDaGg6HUx3Jy8vD4cOHERgYiNDQ0KefN2nSBJaWlkhP\nT9eon4CAAAwdOlRfZpaixs/8S1izBrhwATh3juf/53CkpLrO/NUhCAK2bduGWbNmVdhOpVLBxcUF\nCxcuVNuGl3HUAwoFC/767jtg8mSDD8/hcJ7woom/pqSkpKBx48alPH+eh4u/nggIYMnf7t5lBWE4\nHI7hqanirwlc/PXIvHlAVhawc6dkJnA4NRou/urh4q9HcnMBBwfg338BA3hbcTic5+Dirx7u7aNH\nGjZkm79z53Lffw6H8+LCxb8cJkxgNwE1rrYcDodT7eHLPmq4cwcYPhwICwOaNpXaGg6n5sCXfdTD\n1/wNxOzZzOd/82apLeFwag5c/NXDxd9ApKezzV9PT6BHD6mt4XBqBlz81cM3fA2EpSXw44885w+H\nw6kaMTExUptQBi7+lTBrFhATw9I+cDgcjrbExMSUyuypjvj4eBw4cMAAFjG4+FeCmRlL+rZgAXf9\n5HA42uPm5oYJEyZU2s7Ozg5yuRz37t0zgFVc/DVi9GigcWNg1y6pLeFwOMbE/v37MXLkSPTv3x++\nvr5ljgcHB6N169Ya9zdp0iRs2rRJTBPVwsVfA2QywMWFrf8/U5SHw+HUcCZOnIiGDRti/vz55RZg\n8fDwwKBBgzTuz9zcHMXFxcjLyxPTzHLh4q8h/fsDb70FuLpKbQmHwzEmvLy81Ap8QEAAHBwctOqv\nZ8+e8PPzE8O0CuHirwW//gqsXw88fiy1JRxODUYmE+clAkFBQbCysipTirGEgoICyJ4b68SJEzh1\n6hQWLVqEffv24eOPP0ZERMTT47a2trh//74o9lUEF38taNcO+PBDYNUqqS3hcGowROK8RODixYtw\ncnJCVFQU3N3dsWzZMty6devpcdVzXiLx8fFwcHCAs7MzPD094ezsjAkTJsDOzu5pGwsLC+Tk5Ihi\nX0Vw8deSxYtZ2ceEBKkt4XA4UnPhwgU4OTnh5MmTaNmyJebPnw8XF5enx01NTUu1t7OzQ4cOHZCW\nloZGjRrBwsICzs7OpQq4FBQUoH79+nq3nYu/ltjaAjNnAr/8IrUlHA7H0BQWFsLW1hbR0dFISUlB\naGgonJycMG/ePPTr1w8JCQlo27bt0/bW1tbIf8ZLJDw8HEFBQTh9+jQcHR0BACdPniw1RkZGBmxs\nbPT+Xbj468DChcCRI4ABluU4HI4RYWZmhtmzZyMkJASurq44c+YM6tWr9/T4sWPH8MMPPzx9P2DA\ngFIBXufPn8epU6dARCgsLMSxY8fK7BcEBweX6zkkNjy3j44sXw6EhgL790ttCYfzYlFdc/t4eHhg\n4MCBSElJQceOHQEAmZmZcHFxwYoVKzTuZ8aMGdiuJp88z+1jBMybB3h5ASEhUlvC4XCkxt3dHb/8\n8gvGjh2LgwcPPv28SZMmsLS0RHp6ukb9BAQEYOjQofoysxR85l8F1q4F/P2Bw4eltoTDeXGorjN/\ndQiCgG3btmHWrFkVtlOpVHBxccHChQvVtuEpnY0EuRxo3x44cwbo1UtqazicF4MXTfw1JSUlBY0b\nNy7l+fM8XPyNiHXrgKtXAXd37c4rVBYiMScRqfmpMDcxR/3a9VHfrD5aNGwB01qmlXfA4byg1FTx\n1wQu/kZEQQGb/Z86BfTuXX4bgQTcSbmDC9EX4BntiaCUIGQXZcO2oS2s61ujWFWMfEU+8orzkFWY\nhW7Nu6G3TW+83vp1vNfpPVjUsTDsl+JwJISLv3q4+BsZ69cDly4Bx4+X/jwhJwFbb27F9tvbYVHH\nAkPaDsGQdkPQr2U/WDewRi1Z2f323KJcBKUG4VbyLVyKuQSvWC8Msh+ECd0mYEyXMahtUttA34rD\nkQYu/urh4m9kFBQAHTsy8e/bFwhJDcGyq8twMfoiJnWfhNmvzIaDlXbJnUrILszGsfBj2B28G1EZ\nUVj4xkJM6z0NdUzriPwtOBzjgIu/erj4GyEbNwKnLqfBfuoSuIe7439v/g/Te09HQ/OGoo1xLeEa\nll9djtspt7F0wFLM6DOj3KcHDqc6w8VfPVz8jQwiwjq/zVjg8TMmdpuMjWOXoEndJnobLzApEHPP\nzIWJzARbR25F1+Zd9TYWh2NouPirh4u/EZGWn4apx6fiUf4jDMrajegbnXHokP7HFUjA1ptbseTy\nEnze93MsGbAEZiZm+h+Yw9EzXPzVY3QRvjKZ7G2ZTBYuk8kiZTJZmQgFmUw2QCaTZclksltPXovF\nGFdqzkWdQ++tvdHLuhd8p/liyezOuHoVMEQJzlqyWvjilS8Q9HkQApICMHj3YCTmJOp/YA6H80JQ\n5Zm/TCarBSASgBOAJAABACYQUfgzbQYA+JaI3tOgP6Of+RMRXP1dse7aOuwdsxcD7Qc+PbZyJXD3\nLrBvn+HsEUjAr96/YnPAZux5fw+GtBtiuME5HJHhM3/1GNvMvx+A+0QUR0QKAP8CGFVOO3FK50iM\nUlBi9qnZ2BW0C/7T/UsJPwDMmQOcPw9ERhrOplqyWljsuBj7xuzDJ+6f4PdrvxtucA6HUykxMTFS\nm1AGMcS/JYCHz7xPePLZ87wmk8nuyGSyUzKZTDe/R4nJLcrFu/vfRWx2LHym+aB149Zl2jRqBHz5\nJSv5aGgGtx2MazOuYdutbfjm3DcQSDC8ERwOpxQxMTGl0jqrIz4+HgcOHDCARQxD5REIBGBHRHKZ\nTPYOgGMAXlLX+Keffnr6/4EDB2LgwIH6tq9Scopy8Pbet+Fg5QC3kW4VpmD46isW9RsbC9jbG8xE\nAIBdYzv4TPXB6AOjMeHwBOx+fzePCeBwJMTNzQ2rV6+utJ2dnR0uXryIe/fuVVr0/fLly7h8+XKV\n7BJjzf9VAD8R0dtP3i8CQESk9tvKZLIYAH2JKKOcY0a35l8i/D2te2Kz82aNfOsXLQLy8oBNmwxg\nYDkUKgsx5dgUPMp/hJOTTqKeWb3KTwIAlQqIiwNSUlil+vR0oKgIMDdnr/r1gTZtWEHjRo30+yU4\nNZLqtOa/f/9+7Nu3D48ePYKrq2uZIizBwcG4evUq5s6dq1F/RUVFmD9/PrZs2VLucaNy9ZTJZCYA\nIsA2fJMB3AAwkYjCnmljTUSpT/7fD8BBIrJX059Rib8uwg8AqalAly7M88cAFdnKRSWoMO3ENDzM\nfqj+BpCUBHh6At7eQHAwM9jSktWrtLQEmjVjol9UxF65uezmEB0N1K0L9OkDvPUWe/Xvzz7jcKpA\ndRJ/AJg4cSJGjRqFCRMmlDm2YsUKjB49Gl27ah6LM2PGDPz+++9o0KBBmWNGJf5PBn4bwHqwPYS/\niGiVTCabBfYE8KdMJpsD4AsACgAFAOYTUbmLYMYk/gWKAgzbOwzdrLppJfwlzJ0LNGgArFqlJwM1\nQCWoMPX4VCTmJsJjoge7AYSFAXv2AB4eQGIi4OQEDBrE8lJ366bZjJ6IPR3cuAH4+LCbR3g4MGIE\nMGECMHw4u2lwOFpS3cTfxsYGQUFBZcoxAsDo0aPh7u4OmUxzXd64cSM6deqEYcOGlTlmdOIvJsYi\n/ipBhXGHxsHc1Bz7xuzTKY1CXBybGEdFAU30F/BbKSpBhc//nYzuZ29hblhD1EpMAiZPBsaMAV55\nBTAxEWegtDRW3Pjff5m/6/TpbPe7ddmNcQ5HHZWJv6yKa90lkAh7iUFBQZg8eTJC1JT0Gz58OM6d\nO1fqsxMnTsDExATe3t7o3r07zp49i8WLF6NTp04AgCNHjiAlJQVz5swp05+Y4s8Tx5cDEWH+ufnI\nKszCmY/O6Jw/p00b4N132br/jz+KbKSmJCfDZONG/PmnJ653qIsVQ63wfz/FwKS2HmblzZsDX3zB\nXjExwIYNQM+ewNtvA//7H9C9u/hjcmocYoi2WFy8eBFOTk6Ii4tDQEAAwsLC4OzsjD59+gBg1bme\nJT4+Hg4ODujQoQOWLFmCRYsWwcLCAnZ2dk/bWFhYINIAvuI8K1g5uPi5wCvWC0fHH4W5adVEcuFC\nlvQtL08k4zQlNZWtO3XtCuTkQHb9Onr7ROFyZ3N85fmN/h+r27ZllW5iYlihgyFDgKlTgYQE/Y7L\n4RiQCxcuwMnJCX5+frC0tETnzp1LCbepaen5tZ2dHTp06IC0tDQ0atQIFhYWcHZ2LlW9q6CgAPXr\n19e77Vz8n+NY+DFsuLEBpyedFqWISpcugKMj8NdfIhinCbm5wE8/AQ4OgJkZEBHBHj3at4e5qTnc\nx7vD96EvVnivMIw9jRsDCxawqLcWLdiTwA8/sDzYHE41o7CwELa2toiOjkZKSgpCQ0Ph5OSEiRMn\nwtbWFjdu3MDYsWOftre2tkZ+fv7T9+Hh4QgKCsLp06fh6OgIADh58mSpMTIyMmBjAC8RvuzzDGGP\nwjDTYyZOTzpdbgCXrixcyJbXv/gCqK2vWixEbK3922/ZBu7Nm2z2/RyNzBvhzEdn8Mbfb6BVo1b4\ntNenejLoORo3ZpFvs2czG3v2BLZtAwYMUHtKSlER7snluJefj3C5HAlFRUhTKJBWXIwspRICAOHJ\nE0wjU1NYmpnB0tQUrczN0blePXSuVw8O9eujY926Wm24cTjqMDMzw+zZsxESEgJfX1+cOXMG9eox\nL7pOnTphzJgxWLp0KX59EuU5YMAAXL9+HYMHDwYAnD9/Hnl5eWjRogUKCwtx7NgxtGxZOiY2ODgY\n8+fP1/t34Ru+T8guzEa/7f2w6I1FmNp7quj9DxnC9lg//VT0roH795mopqUBbm7Aa69Vekr443A4\n7nCE+3h3vGH3RqXtRefECWazszPg4gI0bIhIuRwXMzPhk50N3+xs5KpU6Fa/PrrUq4cu9evDztwc\nzWvXRnMzM1iYmsJEJnuaMyRbqUSGUol0hQLxRUUIl8sRLpcjOC8PBYKANxs3xpuNG2NE06bobIBH\nao7uVDdvHwBYuHAhPv30UxQVFWH58uU4fPgwACAzMxMuLi5YsULzJ+0ZM2Zg+/bt5R7j3j4iI5CA\nUf+OQpvGbbBphH6isi5cYI4voaFALbEW21QqwNUVWLOGbah+9RVgqvnD3Nmos5h2fBr8p/ujjUUb\nkYzSHCErC/6rVuGYTAaPd95BjqkphjVpgrcsLPBm48Z4SaQZ+8PCQvhkZ+NKVhZOpqejkakpxjRr\nhvHNm6N7Ob7UHGmpjuJ/7do1pKWl4d69e3j33XdL+fW7urpiypQpsLS0rLSfgIAAREdHY/z48eUe\nF1P8QURG9WImGZZll5fRm3+/SUXKIr2NIQhEL79M5O4uUof37xO98QbRwIFEMTE6d7POfx31+KMH\n5RblimRY5UTm59OP0dFk7+9PDtev0xIPDwro359UGzeyC6VHVIJA17KzaUFUFLX09aVXAwNpR1IS\n5SuVeh2XozlSaIA+UalU5ObmVmk7pVJJq1atqrCNumvz5HOttLbGz/yvxl3F+MPjEfhZIGwb2up1\nrCNH2CT92jVA5wktEbB9O5vp//gje5yowqMEEWGmx0xkFGTgyIdH9LY2rhQEeKSnY2NiIkLz8zHJ\n2hofW1ujd4MGbMyoKGD8eJYUaccOlkZCzygFAaczMrA1KQnXc3Iwp2VLfNWqFSzNeFEcKamOM38x\nSElJQePGjUt5/jwPX/YRiXR5Onpv7Q23kW4Y0XGE3sdTqZgTztatgE6uyjk5wKxZLAXDv/8yVyIR\nKFYVw3GHI8Z0GYPv3/helD5LyFUqsTUpCRsTE2Frbo4vW7bEB1ZWqF3eDauoCPjsMyAkBDh+3KDB\nYVFyOVY/fIijjx5heosW+K51azTX2+48pyJqqvhrgrHl86+WEBGmnZiGcQ7jDCL8AAuk/f57HdM9\n3L4N9O3LvGauXRNN+AGgtkltHBp3CK7+rrgce1mUPjMUCvwcG4t216/jZm4ujnTtCv8+fTDJ2rp8\n4QdYOoidO4FJk4BXX2Xf00B0qFcP2zp1wp2XX4ZcpYLDjRtYHR+PwueCdDicFwZt14n0/YKB1vs2\nXt9Ifbf21es6f3kUFhLZ2hLdvq3FSTt2EFlZEe3fry+ziIjofNR5auHSghJzEnXuI1uhoKXR0dTU\n25umhYVRRH6+bh15eLDvfPSozrZUhYj8fBodEkL2/v50IDWVBD3vRXD+w1AaUB1Rd23A1/w1496j\ne3Dc4YhrM66hQ9MOeh2rPH77jU3k//mnkobFxcA337Csm8eOiTrbV8fyq8txNuosvKZ4aVUQvlCl\nwpakJKyOj8fwpk3xs7092lY1w2dgIMuP8fPPwMyZVetLRy5nZuLLqCjYmZvjj5degl0dXhtB3/Bl\nH/XwNf8qoFAp8Prfr2NG7xmY9fIsvY1TETk5LB1+QEC5cViM1FTggw9YRrg9e9hyjwEQSMDIf0ai\np3VPrByystL2RITDjx7h++ho9KxfHyvatUNXMTdr799nuYGmTmWRwRIEaxULAtbEx+P3hAT8aG+P\nuS1bwoQHjekNLv7q4a6eVWDZ5WU0fM9wyR/jFy0imjNHzcGgIKI2bYiWLCFSqQxpFhERpealku1a\nW/J84Flhu5s5OfTmrVvU88YN8srI0J9BSUlEPXoQffut3l1BKyI8P5/eCAykgbdvU3xBgWR2vOi0\nadOGAPBXOa82bdqUe82gw7KP5GJfxiA9in9gUiBZrbGihOwEvY2hKcnJRE2aEKWmPnfgxAmDrO9X\nxoUHF8h2rS2l5KaUOZZeXEyfR0SQtY8PbUtMJKUhBDk9nahvX6J58yS9ASgFgVbExlJzHx86WOaH\nx+FIgy7iX2O8fYqURfjE/RO4DndFy0bl1Zc3LDY2wLhxLOMnAOa/v24dc+U8cYIVRJEQp3ZOmNJz\nCqYcm/K0EDwRYWdyMhxu3IAMQFi/fphha2uYJZCmTdneh68v8PXX7HpJgIlMhv9r0wYnu3fHDzEx\nmBkRwT2CONWSGrPm/+OlH3H30V0c/fCo0ST5iopiaXhiolRo8ON84NIl4NQpVgjACFCoFBiwcwDG\ndhmLd3t9gc8iIpAvCPijY0e8LFX93uxsViXs5ZfZnVPCn2WuUokZERGIKijAka5dYc9LWHIkgm/4\nqiEkNQSDdw9G0OdBeo/i1ZaP3pdjWdQktLfKAY4eBSyqnkZaTCLSo9HnzGrUbjMJS+3b4ctWraTf\n7MzJYZlLBw9mQRMS2kNE+D0hAavi47Grc2e8rUH+Fg5HbHiQVzmoBBVmeMzAr4N/NTrhx6NH2Bo1\nGHeiG0HhcdbohP9Wbi4+jE5He/tRaB7+Iz5vYSW98AOsxvDZs+wp6UnqXKmQyWSY37o1DnXtimkR\nEXB9+JB7qnCqBS+8+G+6sQl1Tetiep/pUptSmpgY4M030eDdwdjSfxf2HzGeVAJFgoAfoqPxdnAw\nvmvdGndefxvdGlvhh4s/SG3af1hasj2AnTuB9eultgaOFhbw79MHO1NS8HlkJBSCILVJolJUxH5l\nfXyA8+fZpb9wgb2PjQUUCqkt5GjLC73sE5sVi5f/fBl+0/3wkuVLovQpCkFBLI/9woXAl1/i/HkW\nyxUcLGK6Zx0JzM3FlLAwdKxXD1s6dkQLc1bG8rH8MXq59cLu93djcNvB0hr5LHFxwFtvAStWAB9/\nLLU1yFUqMfHePRQIAg537Yom1TBJXGEh4O/PXteusbpAjx+zQmwtW7Kce8xTkBVkS0gAUlJYCec+\nfdg+1muvAf37A3wbxDBwP/9nEASBRuwbQSuurhClP9G4dIm5ch48+PQjQSDq1Yvo5EnpzCpSqejH\n6Ghq7uNWVPe1AAAgAElEQVRD+1JSyo2DOHv/LLV2bU2ZBZkSWFgBoaFEzZsTnTsntSVExNxBv46M\npK7Xr9PDahIPUFBAdPw40UcfEVlYEL36KtE33xAdOkQUF1d5uIlCwTKLHzpENH8+Uf/+RI0aEY0b\nx37V8/IM8jVqLOB+/v9x9N5R6rKpi8Fz91TIkSNM+C9dKnPon3+I3npLApuIKDg3l3oFBJBzUBAl\nFhZW2PZzj8/p02OfGsgyLfD2Ztf25k2pLSEiNvlYExdHdn5+FGrEypeURPTDD+zSDRhAtGkTi0ER\ng7Q0oj//JBo2jKhxY6IvviC6d0+cvjml0UX8X8hln7ziPDhsdsDu93djoP1AcQyrKtu2AUuXAidP\nsmfj51AqgZdeAvbt06gKoyioiOD68CHWPHyI1e3aYaqNTaVusHnFeejxRw9seGcDRr400jCGaoq7\nOzBnDuDtzeoCGAF7UlLw3YMHcO/WDa8bKEWHJkRHA8uWsczZkyYB8+YBHTvqb7ykJJbKfOtWoEcP\nVo5i0CD9jfcs2YXZuJV8CzeTbuLuo7tIyk1CUm4SknOToRD+26yob1YfLRq2gG1DW7Rq2Ao9bXqi\nb4u+6GHdA3XNjHv9irt6PmGh50Ik5SVhz/t7RLKqChABK1eyAiznzlX4F7Z583853PRNTEEBpoSH\noxaAnZ07a+WjfiX2CiYdnYTgz4NhWc/IXBv/+INtAPv7s7xIRsCZ9HR8Eh6O/V26YEjTppLakpEB\nLF8O7NrFqn5++SWLnzMURUXA/v3MhrZt2VZNv37ijiGQgJtJN3Ei4gQ8Ij3wIOMBetr0xCu2r6CH\ndQ+0atQKtg1tYdPABuYm5k/Pyy3ORXJuMpLzkhGbFYs7KXdwK/kWwh+Ho0+LPnDu6Aznl5zRvXl3\no4kVKoGLP4DQtFAM3DUQIV+EwKaBjYiW6YAgAN99xxT93DnAtmJXU7mc/UF4ebGiL/qAiPB3SgoW\nRUdjkZ0d5rdqhVo6/CLPOzsPaflp+GdsZalJJeDbb4Fbt9g1N5KCLN5ZWRgbGoq/OnXCu82aGXx8\nQQDc3ICffgLGjmX/Wlsb3IynKBTA338Dv/zCnnRdXateuycmMwbbbm3Dzjs7YVHHAu91eg/vdXoP\n/Vr2g2ktzWtbP0+BogBX4q7gVOQpnLp/CgAwtddUTOk1BXaN7apmtKbk5zOPkLg4tsOekABkZbEL\nqVRCdvBgzRZ/IsKgXYMwzmEc5vSbI7JlWqJQADNmsDDekyc1noUuXw48eMAqGYpNWnExZkZEIK6w\nEHu7dEG3KhQvlyvk6L21N1Y6rcSYLmNEtFIEVCqmcE2aMIUxkllaQE4ORoaEYEPHjhjfvLnBxo2K\nAqZPZ7+S27YBz9QWl5yCAlbadONG5vw2bx6gjYMUEcEz2hPrrq1DQGIAPu7xMWb2nQkHK/3MnogI\ngcmB2HF7B/4N/Rcv276Mb179BsPaDxP3aSA1lcWyXLrEUptHR7MZYbt2QKtW7E5pYcEulpkZZBMm\n1Gxvn/0h+6m3W29SqiQuxi2XE737LtE772jt5pCRwRK+xceLa9LxR4/IxteXFj14QIUiZQr1ifOh\nFi4t6HH+Y1H6E5W8PJYIboVxeXsF5+ZSC19f2iPWrmoFqFRE69YRWVqyf425Rv39+0TDhxN17UoU\nEFB5e0EQ6FzUOXpt+2vUeVNn2nl7J8mL5fo39BnkxXLadWcXdd3clXq79aYDdw9UTXsePmS/r6+8\nwnbIx44lcnMjunWLqKhixxXUZG+fvKI8auXairzjvHU6XzQyM5nbzqRJRMXFOnXxzTcseaUY5CgU\nND0sjNr6+5N3pvguml+f+ZomH50ser+ikJhI1Lo187IyIkLz8shWzzeA9HSikSOZy+b9+3obRlQE\ngXm9WVkR/fwzcx8tj8CkQHrjrzeoy6YutD9kv+STPZWgIo8ID3pt+2vUdXNXOhV5SvOU8cXFRAcO\nsDtfkyZEs2YRXbxYqdg/T40W/x8u/kCTjkzS6VzRKMk7/9VXVcrD//Ah+z14XMUJtXdmJrX196fp\nYWGUo+4vqYrkFeVR+/XtySPCQy/9V5mbN4maNSO6c0dqS0qhzxvAtWusHMQ332itIUZBQgJzD+3X\njygy8r/PH+U/os9OfEbWv1nT9sDtkov+8wiCQMfDj1PnTZ1p0M5BFJgUqL5xfj7Rhg3sB+XoSLR3\nL/tMR2qs+D/IeECWqy2lzdMfFUXUrh3RL7+Ikm9+6lQ2+9GFAqWSFkRFkY2vLx179KjKtlSGV4wX\ntVzb0viCv0r491/2R2Zk+fdLbgD7UsrWTNCVbdskLX0sGoJAtHFjSTykQHuC9pDVGiv68vSXlCHX\nY+EgEVCoFOQW4EbWv1nT3FNzKbsw+7+DcjnR6tUsKPH999mdWgRqrPiP/nc0/Xr1V63PE43AQKIW\nLYj++EO0LsPC2C++tvFBt3NyqNuNG/R+SAilGXDa98XJL2jasWkGG09rFi8mevNNokqC2AxNaF4e\n2fj60uG0tCr1o1IRLVhA1KEDUUSESMYZAed9U6ne1PfJ8seudC2ugpm0EfI4/zFNPz6dWq5tSYdC\nDpCwcydbhnz/fdGj3Wqk+J+POk/t17enAoVEYfQXLjCV1sO68pgxbKNOE4pVKvo5Joaa+fjQruRk\ng5epzCnMIbt1dpWWfpQMlYpo9Giizz6T2pIy3MrJoeY+PnRSx3W+vDz21Rwdq75UaEwcCztG1r9Z\n0zyPRfTOu4X0+uviRR8bklvHt9Ld1nUoomNTyvLUTw6XGif+CpWCum7uSu5h7ppfJTH5918m/Jcv\n66X7gACiVq0qX7e9m5dHfQMCaPidO5LmkjkdeZra/t6W8oqMNJ1BTg6RgwPzoDAyrmVnk5WPD3mm\np2t1Xno6Wxv/5BOje6jRmWJlMX1z9htqs64N+cb7EhG7d//0E5GdHXN+qRZkZxN9+SWRtTUV7fiL\nvjkzn2zX2tLpyNOiD1XjxP+PgD9o4M6Bhi/GLghEa9cStWzJiq3rkSFDiP76q/xjxSoV/RobS818\nfOjPxETJi9ITEX189GOad0YkVyV9EBnJbtg+PlJbUoYrmZlk5eNDfllZGrVPSiLq1o0t9xjBj14U\n4rPi6bXtr5HzPmdKl5e9ER46pLcHbXE5fZrN3KZNK/U45hXjRW3WtaHZJ2eLulpRo8Q/qyCLrH+z\nptvJt7W7SlVFqWTePA4OLN2hnrl4keill8r6aAfl5lKfgAAaducOxRpR5sjH+Y/JxsWG/B/6S22K\nek6dIrK1ZW4lRsbpx4+puY8PBeXmVtguOpqofXuiX399cYTfO86bbFxsaKX3SlIJ6r3lAgPZ0vmq\nVUb43fPziWbPZgZevFhuk6yCLPrg4AfU26033U8Xxw+3Ron/gvMLDL/BKJezhfgBA1g0lgEQBPZY\nf+gQe1+oUtGS6Giy8vGhv5KSjGK2/zwH7h4gh80OVKgw4nWIFSvYhTXCtZJ/U1PJ1teX7qtx/YuM\nZJPKzZsNbJge2XF7B1mtsaKz989q1D4hgXlVz5ljRMFrN28SderE8mJXElMjCAJtvL6Rmq1pRgfv\nHqywrSbUGPEvce1MyknS/irpSkoKS1I+caLBBcPdnahPH6IrGZnU+fp1GhUcTAlGKFolCIJA7+1/\nj5ZcWiK1KeoRBOZ1MWuW1JaUy9bERLL39y/zc46KYpPKbdskMkxklColLTi/gNqvb0/30rTzgMnK\nInJyYpvdcsMG95ZGEIi2bGHxJPv3a3VqQGIAtf29LX137jtSqHSPxakx4j/2wFhafmW59ldIV0JC\nmJ/40qWSPGc+LiymJsvCyfKSLx2pokugoUjITqBma5pRSGqI1KaoJzubzdTUbapIzMrYWOp24wZl\nPIkUj45mG55GuF+tEwWKAvrg4Ac0YMcAnVOEFBURTZ5M9PrrBnsYL01uLpsQ9uhROiJNCx7nP6Yh\nu4fQ0N1Dy93n0IQaIf4+cT7U2rW14fJ4nDnDdpj27TPMeM8gCALtSk4mG19fcvKIoNeG6pYuQirc\nAtyo/7b+RheJWYp799iMTZOEMgZGEASad/8+vREYSOExSrK3Z8VWXgSyCrJo4M6BNO7guCovD6pU\nLB1Kjx4GdgWNjCTq0oVt6lbx0UOhUtB3576jduvb6TRheuHFXxAEenX7q7T7zm6tL47WCALRmjUs\neEsCz5Dg3FxyvHWL+gYE0I3sbFIo2AbflSsGN0VnVIKKHHc40jp/DYMVpOLwYTalNkA0tLaoBIHG\n3gql+uuDac1acRLySU1SThL1/KMnzTk1R7SJgSCw4Pr27dkTkt7x9GRRuiI/hu0N2ktWa6y0dgd9\n4cX/4N2D1Nutd4WeAKKQn88e5fr2FT+9ZiU8Li6mORERZOXjQ5sTEkj5zDLT9u0s50l1IuJxBFmu\ntqToDEP8RVaBBQuIhg41ot1DRk4OUZ9XVNT+UBB9GhZmlBv82hCTGUPt1rejX678opfvsmkT2wzX\nW7lIQWA5eayt9Rbf4xvvSy1cWtCGaxs0PueFFv9CRSG1W9+OLkaX7z4lGg8esGrqkycbdBepWKWi\njQ8fkpWPD82JiKDH5WQELSpim303bhjMLFFY6b2Shu0ZZtzCpVAQDRzI0kAYCQUFRIMHsz3pXIWS\n+t28Sf/34IHUZulM5ONIsltnp5Wo6cKuXeyBXfQQHKWSuRd17ar3x4vojGhy2Oyg8dPRCy3+rn6u\nNGLfiEovQpVwd2fr+7//brCNXUEQ6HBaGnW8do2G3blTqX/3xo1Eo0YZxDTRKFYWUy+3XrTz9k6p\nTamYlBQ2bTxxQmpLSKkk+uAD9ip5GHlUVEQvXbtGGx8+lNY4HQhNC6WWa1vSnzf/NMh4//7LJuc3\nb4rUYV4eq9ExZAhzMzIAWQVZ5LTLiUbtH0X5xRVn/HxhxT9DnkFWa6zobupdDS+blhQXs/y3bdoQ\n+RsuOMkrI4NeDwyknjdu0DkNw/rlciIbG70HFotOYFIgNf+tOaXkipfBUi/4+bEJQFSUpGbMn8/C\nSZ736I2Wy8nW15cOGVmG0ooISQ2hFi4taE/QHoOOWzKXq/KfdEoKK7AyZYrBc2QXKYvo46MfU/9t\n/SktT72n3wsr/gvOL6AZx2doccm0ICKC/WCdnQ2WFcsnK4sG3b5N7f39aXdycql1fU347TeiceP0\nZJweWei5kD489KHUZlTOxo1EPXtWKb96VVi/njmRqHNdvJ2TQ1Y+PnRZD8V5xCY0LZRauLSgf4L/\nkWT806fZDcDXV8cOHjxgu8hLlkgWTiwIAv1w8Qdqv749RaWXPyl5IcU/NjOWmq5uSok5iTpctgoQ\nBJaCuVkztkuk5x+sIAh0MSODhty5Q238/Gh7UhIV61jwJS+PORqEhopspJ6RF8up44aOdDz8uNSm\nVIwgsEpsU6YY/A/e3Z1lnoiJqbjdhYwMau7jQyGVLBNKSdijMLJda2vwGf/znD2rYzqnoCD2w9iy\nRS92aYtbgBu1cGlBt5LKZrZ7IcX/46Mf0+KLIm/CxccTjRjBvHnCwsTt+zmUgkDuaWnU/+ZN6nTt\nGv2dlERFItTQXbWKaMIEEQw0MJdjLht34ZcS8vLYxt7WrQYbMiCAiZSmIQf7UlKotZ+fpJlc1RHx\nOIJarm1pNPs8586xa3v1qoYneHuzGdaBA3q1S1uO3DtCVmusyji+vHDifzv5Nln/Zl26Ek5VUCqZ\nm5alJSuTpcf1uyyFgtbFx1M7f3965eZNOpSaqvXyTkXk5rJfZr25tOmRWR6zaOaJmVKbUTkREewi\nG8C9KiGBJYl11zI7+W9xcdTtxg3K1LFetD6IzYwlu3V2tD1wu9SmlMLTU8MbQMmjwvnzBrFLWy7H\nXCarNValcgK9cOI/bM8w2nh9owiXi1gqwP79WXF1Pc72b+bk0KzwcGri7U3j794lfz16BqxYwVYn\nqhvZhdnU2rW1/t12xeDIEeYIoMcAsPx8lrtp5UrtzxUEgb6OjKQBt25RgRHEKCTnJlOHDR3od//f\npTalXDw92Uqvt7eaBkePshm/zpsEhuFO8h2yXWtLbgFuVKxSvVji7/nAkzps6EBFyirOzhMTiT79\nlLnI/PlnlQqrqyO1qIg2PnxIvQMCyN7fn5bHxhok8Vp2NvtFDg/X+1CicyryFLVb3854C788y/ff\n6y0ATKVi7pwff6z79oJKEGjc3bs07u5dUkkYS5EuT6duW7rRL1d+kcwGTShZAiqj7/v2Mf/QwOpR\nLjIqPYrsN3ahjl5HXxzxVwkq6u3Wu2qpTjMy2A69pSXRokVMKUUko7iYdiUn09tBQdT46lWafO8e\nnU9PN/gf3y+/sHi06sjko5ONu/BLCQoF0aBBegkAW7KE6LXXWEBXVShQKmnArVv0dWSkJMF0OYU5\n1G9bP1pwfoFxB/M9oWRlx8/vyQd//cU2d0OMOBHhc6QUFVGP637UxP3XF0f8/wn+h/pt66fbL1Fa\nGhP7pk1ZwqXK3Ca0IEoupw0PH9Lg27ep4dWrNCo4mPanpFCehI/bWVls9q/nfWu9UFL4paRUn1GT\nmip6ANiRIyxiO0Wk0IfM4mLqev06rTFAkaFnKVQU0pDdQ2jG8RnVQvhLKMnZGL1oK/vZRkRIbZLG\n3M/Pp/b+/rQ0OprS89OlE38AbwMIBxAJYKGaNhsA3AdwB0CvCvqitr+3Ja8YL82vhCCwTblp04ia\nNCH6/HNRRD+xsJAOpqbSZ+Hh1Nbfn2x8fenTsDByT0uTVPCfZ+VKovHjpbZCNw6HHqZOGzsZLktr\nVSgJALtf9epLwcH6SSb6sKCA7Pz8aK9Yd5RKUKqUNO7gOBpzYIxxZ29VQ8gXmym+lh0Fu0sb1KcN\ngTk51MLXl7Ym/uf+Lon4A6gFIApAGwBmT8S983Nt3gFw6sn/+wO4VkF/mqdxiI9nETF9+hDZ2zMV\n1PGXPluhoCuZmbQuPp4+Cg0le39/aurtTSODg8k1Pp5CcnONdlaTm8uWKqtb1G8J4w6OowXnF0ht\nhmZs2cIK5+bpvleRnk7Urh3RHj25v9/Ny6PmPj4aR43riiAINMtjFg3aOUjUerQGY8MGInt78vwz\nmpo3FzEVhB65mJFBVj4+5P5cXQ+pxP9VAGeeeb/o+dk/ADcA4595HwbAWk1/FJSiRsXy84m8vIiW\nLWNRuZaWbDP3zBmNNnILlEqKyM+nc+np5JaYSPPv36d3goLI3t+f6l+5Qq8GBtLsiAjanpRE9/Ly\nJN080xZXV1bRqDqSmpdK1r9ZG3fd3xIEgf3OTZig0w6tQsH2jr/9Vg+2PYN3ZiY18/GhwJwcvY2x\n5NIS6rO1j3iu2IbkifCXrBAcO2b8e72HUlPVRnbrIv4ydp7uyGSysQCGE9FnT95PBtCPiL56po0H\ngJVE5Pfk/QUA3xPRrXL6o8SAAFB+Pig1FRQXByEuDkJUFFRRUVB26QJl374ocnREUa9eKJLJIBcE\n5KtUyFOpkKtSIVOhQIZSiQyFAmkKBVKKi5FcXIwcpRKtzc1hX6cO7OvUQad69dD5yattnTowrVWr\nStdCSgoKgI4dgePHgb59pbZGew6GHsTSy0txe9Zt1DGtI7U5FVNQALz5JjB5MjB/vlanLlwI3LoF\nnDkDmJrqyb4nuD96hDn378O7d2+0r1tX1L7dbrrBxc8FvtN8Yd3AWtS+9c7GjYCrK+DlBdjbP/3Y\n3R344gv2s+ndWzrzymNrUhJ+jo3F6e7d0athwzLHZTIZiEimTZ96/vXTjU4uLoBMBshkqNOzJ+qO\nGgWZmRnMzM1hWqsWTGQymNeqBfPYWNSpVQt1atVCQxMTNHjyampqivZ16+Llhg1hXbs2bGrXRova\ntWFpZgYTmVbXp9pQty7wf/8H/PgjcPq01NZozziHcewG4LUUq4eultqciqlbFzh6FOjfH+jVCxg0\nSKPTDh0CDh4EAgL0L/wA8L6VFdIUCgwLCoJv796wMTcXpV/3MHcsu7IM3lO9q5/wb9pUrvADwPvv\nA0TAO+8AZ8+yH63UEBFWxcdjW3IyrvbqhQ716gEALl++jMuXL1e986q8wJZ9zj7zXpNln3BUsOzD\n0Y3CQhaPJEHhMVEoWf6pFt4/REQXLrD4kdjYSpvevcs2eKVYVvg5JoZ6BQRQlkL3AuElXI29SlZr\nrCgwyYjXR9SxaVOppR51HD7MloBu3zaMWeoQBIG+vX+fut24QYmVxA1BojV/E/y34VsbbMO3y3Nt\nRuC/Dd9XUcmGL0d3du4kevNNyRIQVpkj945Qxw0dq0fwFxHbbOndu8IMoFlZRB07siIjUiAIAs2J\niKCBt29XKQr4bupdav5bczofZZxpDypkyxY2M9KwCEvJDeBW2RxqBkGhUtHUsDB6NTCQ0jVI3SGJ\n+LNx8TaACDBXzkVPPpsF4LNn2mx6cpMIAtCngr6qcs1qPEolc0YxgnokOvPRkY9o7qm5UpuhGYLA\nwnPVbACrVETvvccKQEmJUhDow7t36f2QEFLoEOX+MPsh2a2zkzxDp05s3cpqNGtZBe3IEZbpwdBP\nawVKJY0OCaFhd+5o7FIumfiL+eLiX3VOnGAJKY0oFEErMuQZ1Mq1FV14cEFqUzRDLid6+WWi1avL\nHFqxgkXwGrgGSLkUqVQ07M4d+jQsTCtPtsyCTOq2pRut9in7/YyebdtYJJ2OxXlKUv0YqnRqjkJB\ng2/fpnF371KhFjdpLv4cImIT0DffJNqxQ2pLdOfs/bNkt87O+FM/lxAfz9IDnDz59KNz51gt2YQE\nCe16jjylkl4LDKR59+9rFLdSqCikgTsH0lenvzLaOBe1/P03i9yNjKxSN8ePV7EgjIY8KiqiV27e\npJnh4VpnAObiz3mKry+b8BhhqneNmX1yNk06Uo3SlpZEAN+9S7GxbM348mWpjSpLRnEx9bhxg5ZV\nsvGpElT04aEPaeyBsdUvenfnTpYjW6SshyW5gLy8ROmuDA8LCqjL9eu06MEDnW6yXPw5pRg1ipV8\nrK7kF+dT502daV/wPqlN0Zzdu0nVth059XxELi5SG6Oe5MJC6njtGrnGx6ttM//sfHLc4Vj9onf3\n7GFPYSInvLp0id0Azp0TtVsKz8+nNn5+VcrJxMWfU4p795h7oYFKE+uFW0m3yGqNFcVmxkptisac\n7rmQQps5klBoBAv9FRBXUED2/v70RznrUmv91lLXzV0pQ66mkLCxsncvW2vTU41THx+2B3D4sDj9\n3czJIRtfX/orKalK/XDx55RhzhyiudXEcUYdq31W01t/v1Utlh62bydy6KyiYudRLA2Eka+TR8nl\n1MrPj3YmJz/9bH/Ifmrt2pris9Q/FRglJcJ/965eh7l9mw3z119V6+fCkzw9R5/L06MLXPw5ZXj0\niM3+q2O5xxKUKiUN3DnQ6IuE3Lz5THrtvDxWI/oX47aZiCgsL49a+PrS/pQU8nzgSc1/a04hqdUn\nrz0RGUz4S4iIYGEDui7tHawgT48ucPHnlMvatUTOzlJbUTUSshPI+jdruhqraQVuw/L4MQsePXTo\nmQ+TkphC7DP+PYuQ3FxqdvUyNdz+ntFeY7UYWPhLiI8n6tSJaMEC7QoEbk5IoJa+vnQnN1c0W7j4\nc8qlsJCofXujrUetMaciT1Er11b0KF9/9XR1QalkmTq/+66cgyEhGlYNl5YHGQ/IanN/srhykf5N\nTZXaHM3ZsYNt7hpY+Et4/JjFcUyaVHkshyAI9L8HD6jjtWv0QC5u/QpdxL/6prHkaIy5OfDbb8A3\n3wBKpdTW6M6IjiMwoesETD0+tWSiYBQsWcKu68qV5Rzs1g345x9g3DggNNTgtmlCal4qhu8djp9f\nmYKrffphXlQU/k1Nldqsytm+HVi8GLh4EejaVRITLC3Z8HI5MGIEkJNTfrtiQcCn4eG4lJkJv969\n0U7kLKs6oe3dQt8v8Jm/XhAEIicnVvumOlOkLKJ+2/rRWr+1UptCRETu7ixzQKV7dvv2sYAjA5dY\nrIysgizq5daLfvL66elnwbm51MLXl/6uogeKXtmyhQWyVDGASyyUSuZc0bVr2fRBWQoFDb1zh0YG\nB1O+nsLuwZd9OBURFsY2JJ9x7KiWxGTGUPPfmku+Nh0ezlZ0NA79X7eOqHNno/G9lRfLyXGHI809\nNbdMYFF4fj619vOjTcYUnlyCiwvbYNEyV4++EQRWI8bG5r/MunEFBdTtxg36IiJCp5xKmsLFn1Mp\nCxeyPGTVndORp8l2rS0l5UgzO83OZjq+bZuWJy5cSNS/P6u9KSEKlYJG7R9FEw9PJJVQvihFy+XU\nzt+fVhnL04ogEP30E9FLL7HdViOlpDD8T//kUEtfX1obH6/31Bi6iH+VK3mJjUwmI2Oz6UUiLw9w\ncAD27gUcHaW2pmosu7IMntGeuPTJJZiZmBlsXEEAxowBWrQA/vhDy5OJgJkzgeho4NQpVhjGwAgk\nYMqxKXgsf4zjE46jtklttW0Ti4owNCgII5o2xZr27VFLqmJIRMD33wPnzgGenoC1cReR2Xj7EeYl\nRGJYyEs4/p0Vaqu/xKKgSyUvvuFbw2jQgBUymjMHUCiktqZqLHZcjEbmjfC95/cGHXf5cuDxY2D9\neh1OlsmArVvZnWPMGKCoSHT7KoKIMPf0XMRnx+PIh0cqFH4AaGluDp/eveGfk4OPw8JQLAgGsvQZ\nlEp2w7xyBbh82aiFn4iwPDYWawqjcKFvd5jfsMKAAUBCgtSWlYWLfw1k7FimPb//LrUlVaOWrBb2\nvr8XHpEe2HVnl0HG9PAAtm0DDh+G7rM5ExNg1y6gXj1g4kSD3YWJCIsuLEJAUgA8Jnqgnlk9jc5r\namaGCz17Ik+lgnNICHIN6TJWUAB88AEQHw9cugQ0bWq4sbVErlJh4r178EhPx40+fTDIthGOHgXe\new945RX20GJUaLtOpO8X+Jq/QYiKIrK0JLp/X2pLqk5oWihZrbEi7zhv/Y4TytZy/f1F6rCoiGjE\nCDADTFwAABHqSURBVKIPPiDSoFpTVVl2eRl13dyVHufrtuGsUKnos/Bw6nHjBsUaIl1sVhaRoyPR\n+PHGURChAh7I5dQ7IIAm37tXbrW0S5eYs9e8efrJtAu+4cvRhrVriQYONPr0Mxpx5v4ZsnGxoegM\nzcr0acvjxyxQTvRSjAUFRO++y1KwVlKntSr8evVX6rSxEyXnVs3VSxAEco2Ppxa+vuSXlSWSdeUQ\nF8dK0s2dq134rAScevyYmvv40IaHDyvc2E1PJxo7lqh7d6LgYHFt4OLP0QqlkqhfP6I//5TaEnFY\nf209dd3clbILs0Xtt7iYaPBgNRG8YlBUxFThnXdYVTCRWe2zmjpu6EiJOYmi9Xny8WNq5uNDe/Th\nNxwYyHLxu7gY9cxEKQi0JDqaWvr6ko+GN0JBYDVmmjUjWrJEvPs9F3+O1pRkHzBGd25tEQSBPvf4\nnIbuHkpFSvGWCebMYbqs17KYCgXLETBoEPMjFQkXXxfqsKEDJWSL/wMOzs2l9v7+NDcykorEmp2f\nPMmUUaycyXriYUEBDbh1iwbevk3JOih4QgLR6NHMXdhbhNVKLv4cnViyhGjkSKOeZGmMJv7r2rBp\nE/sD1ecKx1OUSqLZs4l69iRKrPosffmV5dRhQwd6mP1QBOPKJ7O4mEYFB1P/mzcpriqL2YJAtGYN\nS9Am2qaKfjj26BE19/GhFbGxWpdbfJ4jR9hDzsSJRLGxuvfDxZ+jE0VFRL16vTjLP/JiOb3595v0\n9ZmvqxRcc+oUi9Y0aCCpIBD9+iuLYNWxEpUgCPR/F/6PHDY7GCQIThAEWh0XR9Y+PnT8kQ5J9+Ry\n9tTTp49RB29lKxQ0Mzyc7P39Rd3vyMsjWrqUqGlTokWLiHTJ8szFn6MzJVW/IiKktkQcMuQZ1G1L\nN1rpvVKn82/fZsthfn4iG6YpO3eyIsBaFo0VBIG+PvM19XLrRWl5VS8Sog0+WVnU1t+fpoeFUY5C\nodlJsbFM9D/6SC/7HWJxLj2d7Pz8aGZ4OGVr+t20JCGBaOpU5oX3v/8RaZNclYs/p0ps2kT0yisG\n8To0CAnZCdRufTta579Ou/MSWM6wgwf1ZJimXLjAbgAbN2q0JlesLKYp7lPo1e2vSlZ+MUehoGlh\nYdTO35+uVjaFdXdnd9i1a412zfFRURFNDwuj1n5+dDY93SBjRkcTffEFUZMm7N87dyo/h4s/p0oI\nAtvYXLxYakvEIy4rTqsbQFYWUY8eRCt1e2AQnwcPmG/g1KkVOojnFuXS8D3DaeQ/IymvKM+ABpbP\nsUePqKWvL00PC6PHz88mCguJvvqKFbox0vV9lSDQ1sREsvLxoS8jIylLT7P9ikhKYstBrVsTvfwy\n0R9/qH8a4OLPqTLJyWyd+9IlqS0RD01vAAUFRAMGMNdyo5qI5uURjRvHlkfCw8scTslNob5b+9L0\n49NJoTK8SKkjW6GgryIjydrHh/5OSiKVIDAH9969matLhnEWh7+amUn9bt6k1wMD6XZOjtTmkFLJ\nksV9+CFR48ZEr75KtHw50bVr/80HuPhzRMHTkzldvAjunyWU3ACWX1le7iawUkk0Zgz7A9OrS6eu\nCALLYd+sGUsl+uQ7BKcEU9vf29KSS0v0njlSV27m5NCrN29Sj5Mn6dTQoST89ZeR3V0Zd3JzaURQ\nENn7+9Oe5GR2szIyiopYRb4vv2ROGnXrslLRuog/z+rJKZdffwVOnmR5tPSdkdBQJOUmYcS+EXij\n9RvY8M4GmNQyAcASRs6eDURGAqdPs8pnRktoKDBpEtChA05/7Ywp1xdiw9sbMLH7RKktU8/t26BZ\ns3D8lVfwf5MmwapePSy1t8cgCwvIpMoS+gzXc3Lg8vAhfLKz8YOdHWba2sK8VvVIeyaXA3fuAG+8\noX1WTy7+nHIRBGD0aMDeHtiwQWprxCO7MBtjDo6BRR0L7H1/L+qY1sX33wNeXixvWKNGUltYOUKB\nHP7Th6PzCT/k/bAAbb5fwZLFGRvp6azMors7sGIFMG0alETYm5qKNQ8fwrxWLXzbqhXGN28OMwOL\nrUIQcDI9Ha4JCUgoKsL8Vq0wzcYGDUxNDWqHWOiS0pmLP0ctWVnAyy8DS5cCH38stTXiUaQswqfH\nP0VMZgz6xx3G5ROt4OVl1Akjn5KWn4ZP3D9BbnEujnVdDqtvf2RZQTdsAPr3l9o8RmEh8OefTPA/\n/BBYtgxo0qRUE4EIZzMysPbhQ4Tm52OitTU+at4cfRs21NvTABEhKC8Pu1JT8U9qKjrWrYsvW7XC\n2GbNYFpNZvrq4OLPEZ27d4HBg4FDh4ABA6S2RjwEEjD8l1W4LN+IQxP2Y3SvgVKbVCkXoy/ik2Of\n4NOen+KngT+xAjaCAOzcyarI9+nDig306CGNgUVFwN9/szXD3r2BX34Bevas9LT7cjn2paZib2oq\nTGUyjLC0xJAmTeDYuHGVZ+J5SiUuZ2XhTEYGzmRkQCDCJzY2+MTaGh3qaZbSujrAxZ+jFy5dYmnn\nvbxYFbDqDhGwciVLqf/z3vOYd+UTfPvat/j29W9RS2Z8M0C5Qo6lXkuxL2Qfdo3ehaHth5ZtVFgI\nuLkBq1YBb70FfPkl+9cQa+qpqazIwdatQPfuwM8/swT2WkJEuJmbi/OZmfDMyMDN3Fx0qV8f3evX\nR7f69dGlXj00r10bVmZmsDQzg6lMBiURlETIVSqRWFyMhKIixBUW4nZeHgJzcxFbWIh+DRtihKUl\n3mnaFN3q1zeKfQax4eLP0Rt79gA//gj4+7NCMNUVIuB//2Ob2Z6e7LvEZcVh4pGJqG1SG3+99xfa\nN20vtZlP8YrxwkyPmXil5StY//Z6NK/fvOIT8vLY7HvLFsDMjO1kf/ABYGUlrmFFRcDFi6we6Jkz\nbIw5c4BevUQbIl+lQnBeHkLy83E3Px8RcjkeKRR4pFDgsUIBgQgmMhlMZTI0MDFBS3NztKxdG63r\n1EGvBg3Qp0EDdK1fH7Wr+ZKOJnDx5+iV5cuBI0fYk8BzS7jVAkEA5s4FAgKAs2cBS8v/jqkEFX6/\n9jtW+qzEkgFLMLffXEmfApJyk/DjpR9xPvo8tozYgnc7vatdB0TsB7V1Kysh9f/t3X1sVfUdx/H3\nV2vDQyNFsRQodCoiIBkPQSarW+pEWJz1geDDhrFAnTFuapjxgWZGEhN8yjaNw6gbQ1xgDvBhKDqE\nMXQGWCF0KY4qa6qAPBRRZLUKbel3f/yugzHq5Xrbe249n1dywunl3t/5crj9nt/5/X7n9xs5MvTg\nX3IJDBsGqTanuId1h9etC0OiXnsNRoyAq6+GG26A/PzUypMOpeQvncod7rgjLKW6cmXX6CD9wqFD\nUFERVgN85ZX2R/Vs/WgrFcsqaGpu4qEJDx2/iaUTNR5q5JG1jzB3w1ymj5rOvd+9l17deqVX6MGD\noZb+0kvw5puwc2e4GIwaBUVFUFgYttxcOHw4bI2N4WRt3x6S/oYN4U5i/Hi4+OJwISks7Jh/tKRN\nyV86nTvceWeoVK5a1TUuAB99BFddBX36hFaKZP187s7ztc9T+ZdKivOLmfO9OZw/IPU27FTs+2wf\nT218iserHmfi2RO5/6L7Kc4v7pyDHTgAmzZBTQ3s2gV79oStpSUMGT35ZMjLg0GDwlZcHIZ9DRzY\nOfFI2pT8JSPc4a67QvJfuTIk1Wz17rtw2WUweXLo5E2l+bflcAvzqucx529zKDq1iFvOv4Upw6fQ\nLadbh8Tm7lTvqebJjU+yZMsSJg+dzMzxMxlRMKJDypf4UPKXjHEPHcDPPQcvvxyakbPN8uUwY0YY\neVhR8dXLaW1rZfnW5Tyx8Qmqd1dTNqSMS8+5lAlnTUi5Sab5cDObdm/ixdoXWVq7FIDykeXcPPbm\n5J25Iu1Q8peMmz8f7r4bFi4MfYnZoLkZKith8WJYtAguvLDjyq7fX8/yrct5te5V3tr+FkP7DGX4\nGcMZ1mcY55x2Dnm5eXQ/pTvdc7rT2NxIw6cNNDQ1UL+/nqqdVWzeu5mze59N2ZAypgyfwqjCUV/L\noYeSWUr+Eok33oBrrw0J99ZbMzO0vD3vvReeSejTJzz71JlNUk3NTdQ01FC7r5YtH26h7uM6mlqa\nONh6kM9bPicvN4++eX0p6FFAcX4x4waMY0y/MeTl5nVeUBJLSv4Smbq6kHRPPz0MM+/fP7PHb22F\nRx8NzzjNmgUzZ6bWvi/SlX2V5K9fD+kQgwfD2rVhJODo0aEvIFPX8KqqMBhlxQpYvz4MR1XiF/ly\nqvlLh9u4EaZPDw+CPfAAlJR0znFqasJMAuvWwcMPw9Sp0TY5iURFNX/JCmPHhjnGKyrC1POXXx4S\ndEdc09vawnNKU6bApEmhM7euDq6/XolfJBWq+UunOngwzDAwd25oipk2LVwQBg068TLa2uCdd8Lo\nnWefDQ9p3Xgj3HRT8ge2ROJAHb6StdxD7f+ZZ+CFF6BnT7jggjAFfVFRaCLq3TvU3vfuhQ8/hB07\nQhv+2rVhOoayMigvDzMXq5YvcoSSv3QJ7qGpZv360Fm7ezfs3x82dygoCFu/fmFm4JKSzI8eEulK\nlPxFRGJIHb4iInJClPxFRGJIyV9EJIaU/EVEYkjJX0QkhpT8RURiKMVVnP+XmfUG/ggUA+8D17j7\ngeO8733gANAGtLj7uHSOKyIi6Um35n8PsMrdzwVWA7PaeV8bUOruo5X4RUSil27yvwJYkNhfAFzZ\nzvusA44lIiIdJN2EXODuDQDuvgdobxFSB1aa2QYz+3GaxxQRkTQlbfM3s5VA36NfIiTznx/n7e3N\ny1Di7rvN7AzCRaDW3d9q75izZ8/+735paSmlpaXJwhQRiY01a9awZs2atMpIa24fM6sltOU3mFkh\n8Fd3H5bkM/cBje7+y3b+XnP7iIikIIq5fZYB0xL75cCfjhNUDzPLS+z3BCYCb6d5XBERSUO6Nf/T\ngMXAQGAbYajnJ2bWD/iNu19mZmcCLxKahHKAhe7+4JeUqZq/iEgKNKWziEgMaUpnERE5IUr+IiIx\npOQvIhJDSv4iIjGk5J/F0n2I4+tC5+EInYsjdC7So+SfxfTlDnQejtC5OELnIj1K/iIiMaTkLyIS\nQ1n5kFfUMYiIdDVd/glfERHpfGr2ERGJISV/EZEYyprkb2bfN7N3zGyrmd0ddTxRMbMiM1ttZv80\ns81mdlvUMUXNzE4ys01mtizqWKJkZr3MbImZ1Sa+H9+KOqaomNlMM3vbzGrMbKGZ5UYdU6aY2Twz\nazCzmqNe621mr5vZu2a2wsx6JSsnK5K/mZ0E/BqYBJwH/NDMhkYbVWRagZ+5+3nAeOAnMT4XX7gd\n2BJ1EFngMeDVxIJJI4HaiOOJhJn1B24Fxrj7NwlTxV8XbVQZNZ+QK492D7DK3c8FVgOzkhWSFckf\nGAf8y923uXsL8BxhcfjYcfc97v6PxP6nhF/wAdFGFR0zKwIuBX4bdSxRMrNTge+4+3wAd291939H\nHFaUTgZ6mlkO0APYFXE8GZNYAnf/MS9fASxI7C8ArkxWTrYk/wHAjqN+/oAYJ7wvmNk3gFHA36ON\nJFK/Au6k/fWh4+JMYJ+ZzU80gT1tZt2jDioK7r4L+AWwHdgJfOLuq6KNKnIF7t4AoQIJFCT7QLYk\nfzlGYunLpcDtiTuA2DGzHwANiTshS2xxlQOMAea6+xjgM8KtfuyYWT6hplsM9AfyzOxH0UaVdZJW\nlrIl+e8EBh31c1HitVhK3MouBX7v7v+3LnKMlACXm1k98AfgIjN7NuKYovIBsMPdNyZ+Xkq4GMTR\nBKDe3T9298PAC8C3I44pag1m1hfAzAqBvck+kC3JfwMw2MyKE7321xEWh4+r3wFb3P2xqAOJkrtX\nuvsgdz+L8J1Y7e43RB1XFBK39DvMbEjipYuJbyf4duACM+tmZkY4F3Hr/D72TngZMC2xXw4krTTm\ndHxMqXP3w2b2U+B1wgVpnrvH7T8TADMrAaYCm82smnD7Vunuf442MskCtwELzewUoB6YHnE8kXD3\nKjNbClQDLYk/n442qswxs0VAKXC6mW0H7gMeBJaY2QxgG3BN0nI0vYOISPxkS7OPiIhkkJK/iEgM\nKfmLiMSQkr+ISAwp+YuIxJCSv4hIDCn5i4jEkJK/iEgM/QfH2ioKAeDCAgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f6bb80bef28>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = linspace(0, 10, 100)\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "for n in range(4):\n",
    "    ax.plot(x, jn(n, x), label=r\"$J_%d(x)$\" % n)\n",
    "ax.legend();"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  2.40482556,   5.52007811,   8.65372791,  11.79153444])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# zeros of Bessel functions\n",
    "n = 0 # order\n",
    "m = 4 # number of roots to compute\n",
    "jn_zeros(n, m)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Integration\n",
    "\n",
    "### Numerical integration: quadrature\n",
    "\n",
    "Numerical evaluation of a function of the type\n",
    "\n",
    "$\\displaystyle \\int_a^b f(x) dx$\n",
    "\n",
    "is called *numerical quadrature*, or simply *quadature*. SciPy provides a series of functions for different kind of quadrature, for example the `quad`, `dblquad` and `tplquad` for single, double and triple integrals, respectively.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.integrate import quad, dblquad, tplquad"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `quad` function takes a large number of optional arguments, which can be used to fine-tune the behaviour of the function (try `help(quad)` for details).\n",
    "\n",
    "The basic usage is as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "# define a simple function for the integrand\n",
    "def f(x):\n",
    "    return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "integral value = 0.5 , absolute error = 5.551115123125783e-15\n"
     ]
    }
   ],
   "source": [
    "x_lower = 0 # the lower limit of x\n",
    "x_upper = 1 # the upper limit of x\n",
    "\n",
    "val, abserr = quad(f, x_lower, x_upper)\n",
    "\n",
    "print (\"integral value =\", val, \", absolute error =\", abserr )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we need to pass extra arguments to integrand function we can use the `args` keyword argument:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7366751370811073 9.389126882496403e-13\n"
     ]
    }
   ],
   "source": [
    "def integrand(x, n):\n",
    "    \"\"\"\n",
    "    Bessel function of first kind and order n. \n",
    "    \"\"\"\n",
    "    return jn(n, x)\n",
    "\n",
    "\n",
    "x_lower = 0  # the lower limit of x\n",
    "x_upper = 10 # the upper limit of x\n",
    "\n",
    "val, abserr = quad(integrand, x_lower, x_upper, args=(3,))\n",
    "\n",
    "print (val, abserr) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For simple functions we can use a lambda function (name-less function) instead of explicitly defining a function for the integrand:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "numerical  = 1.7724538509055159 1.4202636780944923e-08\n",
      "analytical = 1.77245385091\n"
     ]
    }
   ],
   "source": [
    "val, abserr = quad(lambda x: exp(-x ** 2), -Inf, Inf)\n",
    "\n",
    "print (\"numerical  =\", val, abserr)\n",
    "\n",
    "analytical = sqrt(pi)\n",
    "print (\"analytical =\", analytical)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As show in the example above, we can also use 'Inf' or '-Inf' as integral limits.\n",
    "\n",
    "Higher-dimensional integration works in the same way:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7853981633974476 1.638229942140971e-13\n"
     ]
    }
   ],
   "source": [
    "def integrand(x, y):\n",
    "    return exp(-x**2-y**2)\n",
    "\n",
    "x_lower = 0  \n",
    "x_upper = 10\n",
    "y_lower = 0\n",
    "y_upper = 10\n",
    "\n",
    "val, abserr = dblquad(integrand, x_lower, x_upper, lambda x : y_lower, lambda x: y_upper)\n",
    "\n",
    "print (val, abserr )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note how we had to pass lambda functions for the limits for the y integration, since these in general can be functions of x."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ordinary differential equations (ODEs)\n",
    "\n",
    "SciPy provides two different ways to solve ODEs: An API based on the function `odeint`, and object-oriented API based on the class `ode`. Usually `odeint` is easier to get started with, but the `ode` class offers some finer level of control.\n",
    "\n",
    "Here we will use the `odeint` functions. For more information about the class `ode`, try `help(ode)`. It does pretty much the same thing as `odeint`, but in an object-oriented fashion.\n",
    "\n",
    "To use `odeint`, first import it from the `scipy.integrate` module:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.integrate import odeint, ode"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A system of ODEs are usually formulated on standard form before it is attacked numerically. The standard form is:\n",
    "\n",
    "$y' = f(y, t)$\n",
    "\n",
    "where \n",
    "\n",
    "$y = [y_1(t), y_2(t), ..., y_n(t)]$ \n",
    "\n",
    "and $f$ is some function that gives the derivatives of the function $y_i(t)$. To solve an ODE we need to know the function $f$ and an initial condition, $y(0)$.\n",
    "\n",
    "Note that higher-order ODEs can always be written in this form by introducing new variables for the intermediate derivatives.\n",
    "\n",
    "Once we have defined the Python function `f` and array `y_0` (that is $f$ and $y(0)$ in the mathematical formulation), we can use the `odeint` function as:\n",
    "\n",
    "    y_t = odeint(f, y_0, t)\n",
    "\n",
    "where `t` is and array with time-coordinates for which to solve the ODE problem. `y_t` is an array with one row for each point in time in `t`, where each column corresponds to a solution `y_i(t)` at that point in time. \n",
    "\n",
    "We will see how we can implement `f` and `y_0` in Python code in the examples below."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Example: double pendulum"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's consider a physical example: The double compound pendulum, described in some detail here: http://en.wikipedia.org/wiki/Double_pendulum"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<img src=\"http://upload.wikimedia.org/wikipedia/commons/c/c9/Double-compound-pendulum-dimensioned.svg\"/>"
      ],
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import Image\n",
    "Image(url='http://upload.wikimedia.org/wikipedia/commons/c/c9/Double-compound-pendulum-dimensioned.svg')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The equations of motion of the pendulum are given on the wiki page:\n",
    "\n",
    "${\\dot \\theta_1} = \\frac{6}{m\\ell^2} \\frac{ 2 p_{\\theta_1} - 3 \\cos(\\theta_1-\\theta_2) p_{\\theta_2}}{16 - 9 \\cos^2(\\theta_1-\\theta_2)}$\n",
    "\n",
    "${\\dot \\theta_2} = \\frac{6}{m\\ell^2} \\frac{ 8 p_{\\theta_2} - 3 \\cos(\\theta_1-\\theta_2) p_{\\theta_1}}{16 - 9 \\cos^2(\\theta_1-\\theta_2)}.$\n",
    "\n",
    "${\\dot p_{\\theta_1}} = -\\frac{1}{2} m \\ell^2 \\left [ {\\dot \\theta_1} {\\dot \\theta_2} \\sin (\\theta_1-\\theta_2) + 3 \\frac{g}{\\ell} \\sin \\theta_1 \\right ]$\n",
    "\n",
    "${\\dot p_{\\theta_2}} = -\\frac{1}{2} m \\ell^2 \\left [ -{\\dot \\theta_1} {\\dot \\theta_2} \\sin (\\theta_1-\\theta_2) +  \\frac{g}{\\ell} \\sin \\theta_2 \\right]$\n",
    "\n",
    "To make the Python code simpler to follow, let's introduce new variable names and the vector notation: $x = [\\theta_1, \\theta_2, p_{\\theta_1}, p_{\\theta_2}]$\n",
    "\n",
    "${\\dot x_1} = \\frac{6}{m\\ell^2} \\frac{ 2 x_3 - 3 \\cos(x_1-x_2) x_4}{16 - 9 \\cos^2(x_1-x_2)}$\n",
    "\n",
    "${\\dot x_2} = \\frac{6}{m\\ell^2} \\frac{ 8 x_4 - 3 \\cos(x_1-x_2) x_3}{16 - 9 \\cos^2(x_1-x_2)}$\n",
    "\n",
    "${\\dot x_3} = -\\frac{1}{2} m \\ell^2 \\left [ {\\dot x_1} {\\dot x_2} \\sin (x_1-x_2) + 3 \\frac{g}{\\ell} \\sin x_1 \\right ]$\n",
    "\n",
    "${\\dot x_4} = -\\frac{1}{2} m \\ell^2 \\left [ -{\\dot x_1} {\\dot x_2} \\sin (x_1-x_2) +  \\frac{g}{\\ell} \\sin x_2 \\right]$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "g = 9.82\n",
    "L = 0.5\n",
    "m = 0.1\n",
    "\n",
    "def dx(x, t):\n",
    "    \"\"\"\n",
    "    The right-hand side of the pendulum ODE\n",
    "    \"\"\"\n",
    "    x1, x2, x3, x4 = x[0], x[1], x[2], x[3]\n",
    "    \n",
    "    dx1 = 6.0/(m*L**2) * (2 * x3 - 3 * cos(x1-x2) * x4)/(16 - 9 * cos(x1-x2)**2)\n",
    "    dx2 = 6.0/(m*L**2) * (8 * x4 - 3 * cos(x1-x2) * x3)/(16 - 9 * cos(x1-x2)**2)\n",
    "    dx3 = -0.5 * m * L**2 * ( dx1 * dx2 * sin(x1-x2) + 3 * (g/L) * sin(x1))\n",
    "    dx4 = -0.5 * m * L**2 * (-dx1 * dx2 * sin(x1-x2) + (g/L) * sin(x2))\n",
    "    \n",
    "    return [dx1, dx2, dx3, dx4]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "# choose an initial state\n",
    "x0 = [pi/4, pi/2, 0, 0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "# time coodinate to solve the ODE for: from 0 to 10 seconds\n",
    "t = linspace(0, 10, 250)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "# solve the ODE problem\n",
    "x = odeint(dx, x0, t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f6bb5781668>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot the angles as a function of time\n",
    "\n",
    "fig, axes = plt.subplots(1,2, figsize=(12,4))\n",
    "axes[0].plot(t, x[:, 0], 'r', label=\"theta1\")\n",
    "axes[0].plot(t, x[:, 1], 'b', label=\"theta2\")\n",
    "\n",
    "\n",
    "x1 = + L * sin(x[:, 0])\n",
    "y1 = - L * cos(x[:, 0])\n",
    "\n",
    "x2 = x1 + L * sin(x[:, 1])\n",
    "y2 = y1 - L * cos(x[:, 1])\n",
    "    \n",
    "axes[1].plot(x1, y1, 'r', label=\"pendulum1\")\n",
    "axes[1].plot(x2, y2, 'b', label=\"pendulum2\")\n",
    "axes[1].set_ylim([-1, 0])\n",
    "axes[1].set_xlim([1, -1]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Simple annimation of the pendulum motion. We will see how to make better animation in Lecture 4."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "from IPython.display import clear_output\n",
    "import time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'display' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-40-01507e1888b5>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m     15\u001b[0m     \u001b[0max\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mset_xlim\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     16\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 17\u001b[1;33m     \u001b[0mdisplay\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfig\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     18\u001b[0m     \u001b[0mclear_output\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     19\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'display' is not defined"
     ]
    },
    {
     "data": {
      "image/png": "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\nTwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f6bb557c5c0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(4,4))\n",
    "\n",
    "for t_idx, tt in enumerate(t[:200]):\n",
    "\n",
    "    x1 = + L * sin(x[t_idx, 0])\n",
    "    y1 = - L * cos(x[t_idx, 0])\n",
    "\n",
    "    x2 = x1 + L * sin(x[t_idx, 1])\n",
    "    y2 = y1 - L * cos(x[t_idx, 1])\n",
    "    \n",
    "    ax.cla()    \n",
    "    ax.plot([0, x1], [0, y1], 'r.-')\n",
    "    ax.plot([x1, x2], [y1, y2], 'b.-')\n",
    "    ax.set_ylim([-1.5, 0.5])\n",
    "    ax.set_xlim([1, -1])\n",
    "\n",
    "    display(fig)\n",
    "    clear_output()\n",
    "    \n",
    "    time.sleep(0.1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Example: Damped harmonic oscillator"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "ODE problems are important in computational physics, so we will look at one more example: the damped harmonic oscillation. This problem is well described on the wiki page: http://en.wikipedia.org/wiki/Damping\n",
    "\n",
    "The equation of motion for the damped oscillator is:\n",
    "\n",
    "$\\displaystyle \\frac{\\mathrm{d}^2x}{\\mathrm{d}t^2} + 2\\zeta\\omega_0\\frac{\\mathrm{d}x}{\\mathrm{d}t} + \\omega^2_0 x = 0$\n",
    "\n",
    "where $x$ is the position of the oscillator, $\\omega_0$ is the frequency, and $\\zeta$ is the damping ratio. To write this second-order ODE on standard form we introduce $p = \\frac{\\mathrm{d}x}{\\mathrm{d}t}$:\n",
    "\n",
    "$\\displaystyle \\frac{\\mathrm{d}p}{\\mathrm{d}t} = - 2\\zeta\\omega_0 p - \\omega^2_0 x$\n",
    "\n",
    "$\\displaystyle \\frac{\\mathrm{d}x}{\\mathrm{d}t} = p$\n",
    "\n",
    "In the implementation of this example we will add extra arguments to the RHS function for the ODE, rather than using global variables as we did in the previous example. As a consequence of the extra arguments to the RHS, we need to pass an keyword argument `args` to the `odeint` function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "def dy(y, t, zeta, w0):\n",
    "    \"\"\"\n",
    "    The right-hand side of the damped oscillator ODE\n",
    "    \"\"\"\n",
    "    x, p = y[0], y[1]\n",
    "    \n",
    "    dx = p\n",
    "    dp = -2 * zeta * w0 * p - w0**2 * x\n",
    "\n",
    "    return [dx, dp]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "# initial state: \n",
    "y0 = [1.0, 0.0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "# time coodinate to solve the ODE for\n",
    "t = linspace(0, 10, 1000)\n",
    "w0 = 2*pi*1.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "# solve the ODE problem for three different values of the damping ratio\n",
    "\n",
    "y1 = odeint(dy, y0, t, args=(0.0, w0)) # undamped\n",
    "y2 = odeint(dy, y0, t, args=(0.2, w0)) # under damped\n",
    "y3 = odeint(dy, y0, t, args=(1.0, w0)) # critial damping\n",
    "y4 = odeint(dy, y0, t, args=(5.0, w0)) # over damped"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\noFrfAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f6bb5535eb8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()\n",
    "ax.plot(t, y1[:,0], 'k', label=\"undamped\", linewidth=0.25)\n",
    "ax.plot(t, y2[:,0], 'r', label=\"under damped\")\n",
    "ax.plot(t, y3[:,0], 'b', label=r\"critical damping\")\n",
    "ax.plot(t, y4[:,0], 'g', label=\"over damped\")\n",
    "ax.legend();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Fourier transform\n",
    "\n",
    "Fourier transforms are one of the universal tools in computational physics, which appear over and over again in different contexts. SciPy provides functions for accessing the classic [FFTPACK](http://www.netlib.org/fftpack/) library from NetLib, which is an efficient and well tested FFT library written in FORTRAN. The SciPy API has a few additional convenience functions, but overall the API is closely related to the original FORTRAN library.\n",
    "\n",
    "To use the `fftpack` module in a python program, include it using:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.fftpack import *"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To demonstrate how to do a fast Fourier transform with SciPy, let's look at the FFT of the solution to the damped oscillator from the previous section:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "N = len(t)\n",
    "dt = t[1]-t[0]\n",
    "\n",
    "# calculate the fast fourier transform\n",
    "# y2 is the solution to the under-damped oscillator from the previous section\n",
    "F = fft(y2[:,0]) \n",
    "\n",
    "# calculate the frequencies for the components in F\n",
    "w = fftfreq(N, dt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nbmjaFwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f6bb57140b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(9,3))\n",
    "ax.plot(w, abs(F));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Since the signal is real, the spectrum is symmetric. We therefore only need to plot the part that corresponds to the postive frequencies. To extract that part of the `w` and `F` we can use some of the indexing tricks for NumPy arrays that we saw in Lecture 2:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "indices = where(w > 0) # select only indices for elements that corresponds to positive frequencies\n",
    "w_pos = w[indices]\n",
    "F_pos = F[indices]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nBQwRERGJ3P8Hu9DExd3VDXIAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f6bb4fb95c0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(9,3))\n",
    "ax.plot(w_pos, abs(F_pos))\n",
    "ax.set_xlim(0, 5);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As expected, we now see a peak in the spectrum that is centered around 1, which is the frequency we used in the damped oscillator example."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Linear algebra\n",
    "\n",
    "The linear algebra module contains a lot of matrix related functions, including linear equation solving, eigenvalue solvers, matrix functions (for example matrix-exponentiation), a number of different decompositions (SVD, LU, cholesky), etc. \n",
    "\n",
    "Detailed documetation is available at: http://docs.scipy.org/doc/scipy/reference/linalg.html\n",
    "\n",
    "Here we will look at how to use some of these functions:\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Linear equation systems\n",
    "\n",
    "Linear equation systems on the matrix form\n",
    "\n",
    "$A x = b$\n",
    "\n",
    "where $A$ is a matrix and $x,b$ are vectors can be solved like:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "A = array([[1,2,3], [4,5,6], [7,8,9]])\n",
    "b = array([1,2,3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.23333333,  0.46666667,  0.1       ])"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from scipy import linalg\n",
    "x = linalg.solve(A, b)\n",
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  0.00000000e+00,  -2.22044605e-16,   0.00000000e+00])"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# check\n",
    "dot(A, x) - b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can also do the same with\n",
    "\n",
    "$A X = B$\n",
    "\n",
    "where $A, B, X$ are matrices:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "A = rand(3,3)\n",
    "B = rand(3,3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.40337317,  0.28669679, -0.58103884],\n",
       "       [ 0.44995613, -0.1506805 ,  1.37081515],\n",
       "       [ 0.57860337,  0.73812484, -0.46833359]])"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = linalg.solve(A, B)\n",
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.1677797545656835e-16"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# check\n",
    "linalg.norm(dot(A, X) - B)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Eigenvalues and eigenvectors"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The eigenvalue problem for a matrix $A$:\n",
    "\n",
    "$\\displaystyle A v_n = \\lambda_n v_n$\n",
    "\n",
    "where $v_n$ is the $n$th eigenvector and $\\lambda_n$ is the $n$th eigenvalue.\n",
    "\n",
    "To calculate eigenvalues of a matrix, use the `eigvals` and for calculating both eigenvalues and eigenvectors, use the function `eig`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [],
   "source": [
    "evals = linalg.eigvals(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.45919215+0.j,  0.68783809+0.j, -0.42605459+0.j])"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "evals"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [],
   "source": [
    "evals, evecs = linalg.eig(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.45919215+0.j,  0.68783809+0.j, -0.42605459+0.j])"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "evals"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.5727457 , -0.95855244,  0.20018971],\n",
       "       [-0.58113145,  0.25227888, -0.74683845],\n",
       "       [-0.57814236,  0.13241066,  0.63415803]])"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "evecs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The eigenvectors corresponding to the $n$th eigenvalue (stored in `evals[n]`) is the $n$th *column* in `evecs`, i.e., `evecs[:,n]`. To verify this, let's try mutiplying eigenvectors with the matrix and compare to the product of the eigenvector and the eigenvalue:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.654751537338637e-16"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "n = 1\n",
    "linalg.norm(dot(A, evecs[:,n]) - evals[n] * evecs[:,n])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There are also more specialized eigensolvers, like the `eigh` for Hermitian matrices. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Matrix operations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.38560047,  0.22199536, -0.91689603],\n",
       "       [-0.3451778 , -0.84399557,  1.87916877],\n",
       "       [ 0.05664037,  1.37168794, -0.74958075]])"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# the matrix inverse\n",
    "linalg.inv(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.427625859430596"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# determinant\n",
    "linalg.det(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1.4899133502085211, 1.4651628895060738)"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# norms of various orders\n",
    "linalg.norm(A, ord=2), linalg.norm(A, ord=Inf)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Sparse matrices\n",
    "\n",
    "Sparse matrices are often useful in numerical simulations dealing with large systems, if the problem can be described in matrix form where the matrices or vectors mostly contains zeros. Scipy has a good support for sparse matrices, with basic linear algebra operations (such as equation solving, eigenvalue calculations, etc).\n",
    "\n",
    "There are many possible strategies for storing sparse matrices in an efficient way. Some of the most common are the so-called coordinate form (COO), list of list (LIL) form,  and compressed-sparse column CSC (and row, CSR). Each format has some advantanges and disadvantages. Most computational algorithms (equation solving, matrix-matrix multiplication, etc) can be efficiently implemented using CSR or CSC formats, but they are not so intuitive and not so easy to initialize. So often a sparse matrix is initially created in COO or LIL format (where we can efficiently add elements to the sparse matrix data), and then converted to CSC or CSR before used in real calcalations.\n",
    "\n",
    "For more information about these sparse formats, see e.g. http://en.wikipedia.org/wiki/Sparse_matrix\n",
    "\n",
    "When we create a sparse matrix we have to choose which format it should be stored in. For example, "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.sparse import *"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 0, 0, 0],\n",
       "       [0, 3, 0, 0],\n",
       "       [0, 1, 1, 0],\n",
       "       [1, 0, 0, 1]])"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# dense matrix\n",
    "M = array([[1,0,0,0], [0,3,0,0], [0,1,1,0], [1,0,0,1]]); M"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<4x4 sparse matrix of type '<class 'numpy.int64'>'\n",
       "\twith 6 stored elements in Compressed Sparse Row format>"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# convert from dense to sparse\n",
    "A = csr_matrix(M); A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "matrix([[1, 0, 0, 0],\n",
       "        [0, 3, 0, 0],\n",
       "        [0, 1, 1, 0],\n",
       "        [1, 0, 0, 1]], dtype=int64)"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# convert from sparse to dense\n",
    "A.todense()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "More efficient way to create sparse matrices: create an empty matrix and populate with using matrix indexing (avoids creating a potentially large dense matrix)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<4x4 sparse matrix of type '<class 'numpy.float64'>'\n",
       "\twith 6 stored elements in LInked List format>"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A = lil_matrix((4,4)) # empty 4x4 sparse matrix\n",
    "A[0,0] = 1\n",
    "A[1,1] = 3\n",
    "A[2,2] = A[2,1] = 1\n",
    "A[3,3] = A[3,0] = 1\n",
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "matrix([[ 1.,  0.,  0.,  0.],\n",
       "        [ 0.,  3.,  0.,  0.],\n",
       "        [ 0.,  1.,  1.,  0.],\n",
       "        [ 1.,  0.,  0.,  1.]])"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.todense()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Converting between different sparse matrix formats:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<4x4 sparse matrix of type '<class 'numpy.float64'>'\n",
       "\twith 6 stored elements in LInked List format>"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<4x4 sparse matrix of type '<class 'numpy.float64'>'\n",
       "\twith 6 stored elements in Compressed Sparse Row format>"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A = csr_matrix(A); A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<4x4 sparse matrix of type '<class 'numpy.float64'>'\n",
       "\twith 6 stored elements in Compressed Sparse Column format>"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A = csc_matrix(A); A"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can compute with sparse matrices like with dense matrices:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "matrix([[ 1.,  0.,  0.,  0.],\n",
       "        [ 0.,  3.,  0.,  0.],\n",
       "        [ 0.,  1.,  1.,  0.],\n",
       "        [ 1.,  0.,  0.,  1.]])"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.todense()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "matrix([[ 1.,  0.,  0.,  0.],\n",
       "        [ 0.,  9.,  0.,  0.],\n",
       "        [ 0.,  4.,  1.,  0.],\n",
       "        [ 2.,  0.,  0.,  1.]])"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(A * A).todense()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "matrix([[ 1.,  0.,  0.,  0.],\n",
       "        [ 0.,  9.,  0.,  0.],\n",
       "        [ 0.,  4.,  1.,  0.],\n",
       "        [ 2.,  0.,  0.,  1.]])"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dot(A, A).todense()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1],\n",
       "       [2],\n",
       "       [3],\n",
       "       [4]])"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "v = array([1,2,3,4])[:,newaxis]; v"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.],\n",
       "       [ 6.],\n",
       "       [ 5.],\n",
       "       [ 5.]])"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# sparse matrix - dense vector multiplication\n",
    "A * v"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "matrix([[ 1.],\n",
       "        [ 6.],\n",
       "        [ 5.],\n",
       "        [ 5.]])"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# same result with dense matrix - dense vector multiplcation\n",
    "A.todense() * v"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Optimization\n",
    "\n",
    "Optimization (finding minima or maxima of a function) is a large field in mathematics, and optimization of complicated functions or in many variables can be rather involved. Here we will only look at a few very simple cases. For a more detailed introduction to optimization with SciPy see: http://scipy-lectures.github.com/advanced/mathematical_optimization/index.html\n",
    "\n",
    "To use the optimization module in scipy first include the `optimize` module:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy import optimize"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Finding a minima\n",
    "\n",
    "Let's first look at how to find the minima of a simple function of a single variable:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [],
   "source": [
    "def f(x):\n",
    "    return 4*x**3 + (x-2)**2 + x**4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\ni4hk2P8H0Zflabp+ZCcAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f6bb4f89710>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax  = plt.subplots()\n",
    "x = linspace(-5, 3, 100)\n",
    "ax.plot(x, f(x));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use the `fmin_bfgs` function to find the minima of a function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Optimization terminated successfully.\n",
      "         Current function value: -3.506641\n",
      "         Iterations: 6\n",
      "         Function evaluations: 30\n",
      "         Gradient evaluations: 10\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([-2.67298167])"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_min = optimize.fmin_bfgs(f, -2)\n",
    "x_min "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Optimization terminated successfully.\n",
      "         Current function value: 2.804988\n",
      "         Iterations: 3\n",
      "         Function evaluations: 15\n",
      "         Gradient evaluations: 5\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([ 0.46961745])"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "optimize.fmin_bfgs(f, 0.5) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can also use the `brent` or `fminbound` functions. They have a bit different syntax and use different algorithms. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.46961743402759754"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "optimize.brent(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-2.6729822917513886"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "optimize.fminbound(f, -4, 2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Finding a solution to a function\n",
    "\n",
    "To find the root for a function of the form $f(x) = 0$ we can use the `fsolve` function. It requires an initial guess: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [],
   "source": [
    "omega_c = 3.0\n",
    "def f(omega):\n",
    "    # a transcendental equation: resonance frequencies of a low-Q SQUID terminated microwave resonator\n",
    "    return tan(2*pi*omega) - omega_c/omega"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/zieglerk/local/share/anaconda3/lib/python3.5/site-packages/ipykernel/__main__.py:4: RuntimeWarning: divide by zero encountered in true_divide\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlcAAAD7CAYAAABHerE4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XeYVdXVBvB3R6UoBhUFjNhrxIKaKMY2mlg/WyyxRY1K\nNJZEozF+tgiWL4mJvWBEScQOKEoohjqgjkOR3pyhyAxlGAZmYDoz9+7vj8VEGM4w5e6z9j3nvr/n\n4QFlvCyOZ+5dZ+211zbWWhARERGRG9/zHQARERFRnDC5IiIiInKIyRURERGRQ0yuiIiIiBxickVE\nRETkEJMrIiIiIod21PqDjDGc+UBERESRYa01bfnvVCtX1trI/DjuOIvp0/3HkcqPxx57zHsMLfnx\nzjsW117rP45MuearVll07+4/jky65o8+atGvn/84Muma9+5tkZPjP45MuuY77WRRU+M/Dlc/UsFl\nwSZYC3yPV0dFXR2wo1oNlWprgfbtfUeRWWpqeM21VVcDHTv6jiJz1NfLj3btfEeSHpg+NCGZBEyb\nioHUWvX1wE47+Y4ic2zaxDdAbbW1QIcOvqPILDU1vOaaqquBnXfm52YDJldNsDb6N0lWVpbvEFqk\nvj4+lasoXPO4Va6icM3jVrmKwjWPW+Uq3a953K53qphcNSGZjP6yYLp/MzaI07JgFK553CpXUbjm\ncatcReGax61yle7XnMnV1iKePoQnDpWrqOCyoK64Va6iIG4f9FHAD3tdVVWyLEiCyVUT2NCuJ06V\nqyiIW+UqCuK2LBgFTGh1MZndGtOHJrChXQ8rV7pYudIXt2XBdJdIyA++r+hhcrU1JldN4LKgnjg1\ntEcBK1f6WLnS1VC14nu4Hi4Lbo3JVRPi0NAeFVwW1MXKlT5WrnSxiqKP13xrTB+awMqVHi4L6mLl\nSh8rV7rYb6WPydXWmFw1gQ3teli50sXKlT5+2OviB70+LgtujelDE9jQroeVK12sXOnjsqAuJrP6\nmNBujclVE7gsqIcN7bpYudLHZUFd/KDXx2u+NSZXTWBDux4uC+pi5UofK1e6Kiu5RKWtqorJ1ZaY\nPjSBlSs9XBbUxcqVvupqJleaKiuBTp18R5FZeM23xuSqCWxo18PKlS5WrnRZK8kVKyl6KiuBXXbx\nHUVmKS9ncrUlZ+mDMeZ7xpgZxpjhrl7TJza062HlShcrV7oa+q34sKaHyZW+igpg1119R5E+XH67\n3w1ggcPX84rLgnrY0K6LlStd3KKur6KCVRRtrFxtzUlyZYzpAeACAG+4eL10wIZ2PVwW1MXKlS42\nV+tj5UofK1dbc5U+PAfgfgDW0et5x8qVHi4L6mLlShcrV/qYXOljtXBrKdcLjDH/A2CNtXaWMSYL\nQJMpSd++ff/766ysLGRlZaX6x4eGDe16WLnSxcqVLiZX+ioqgC5dfEeRWcrLo1+5ys7ORnZ2tpPX\ncvGRdgqAi40xFwDoCGBXY8wga+0Njb9wy+Qq3bGhXQ8rV7pYudJVVcUqijaOBdAXh8pV46JPv379\n2vxaKddmrLUPWWv3s9YeBOBqABOCEquo4bKgHja06+IkZV2sXOnjsqC+OFSuXOLCVxPY0K6Hy4K6\nmFzpYnKlr6KCyZW2OFSuXHL6kWatnQRgksvX9IWVKz1cFtTF5EoXdwvq47Kgrro6eR/nKQTfYW2m\nCWxo18PKlS4mV7pYudLHypWuhhlXLEh8h+lDE9jQroc9V7qYXOlicqWvvBz4/vd9R5E5ysqA3Xf3\nHUV6YXLVBC4L6tm0iaMBNDG50sXkSt/GjUyuNJWWArvt5juK9MLkqglsaNfD0QC6mFzp4s41fdy5\npouVq20xfWgCK1d6mFzpqqpicqWJH/S6kknuXNNWVsbKVWNMrprAhnY9TK50sXKlix/0uhp2Z+6w\ng+9IMgeTq20xfWgCG9r11NYyudKSSMgGAl5vPaxc6eL11seeq20xuWoClwX1sHKlp6FqxXtbDytX\nutjMro89V9tictUENrTr4W5BPVwS1MfkSheTK31cFtwW04cmsHKlI5GQn9kfoaO6mmMBtHGZStfG\njbze2phcbYvJVQBr5WcmV+HjkqAuVq70sXKli8msPvZcbYvJVQAmV3rYzK6LyZU+ftjrKi1l/482\n9lxti8lVAC4J6mHlSheTK32sXOkqLQX22MN3FJmFy4LbYnIVgM3setjMrovTwnUlkzK0lddcz/r1\nrKJoY3K1LaYQAVi50sPKla6KCn7Qa2oYaMmHNT3r17NypY09V9vit3wATmfXw+RKV2Ull6g0bdjA\nsQDauCyoq7YWqKvjQ1tjTCECcDq7HiZXurgsqGvDBqBzZ99RZBYuC+rasEGqVvzM3BqTqwBcFtTD\n3YK6mFzpYnKlj5UrXaWlvMeDMLkKwIZ2Paxc6WLPlS4mV/pYudK1bh2w116+o0g/TCECsHKlh7sF\ndbFypYvJlT42tOsqLga6dvUdRfphchWADe16WLnSxYZ2XUyudCUSMrSV11zPmjVMroIwhQjAhnY9\nTK50sXKli8mVrg0bZBo+zyrVw8pVMCZXAbgsqIcN7bqYXOlicqWLS4L6mFwFY3IVgA3teli50sWG\ndl1MrnTxXEF9xcVAt26+o0g/TCECsHKlh8mVLlaudPFYEF2sXOlj5SoYk6sAbGjXU1sLdOjgO4rM\nwUOEda1bB3Tp4juKzMEZV/qYXAVjChGADe16amqYXGkqL+dxLJrWreOHvSbOuNLH5CoYk6sAXBbU\nw+RK18aNTK40rV/PypWmkhJgzz19R5E56utl6Zv3+LaYXAVgQ7seJle6ystlqzrp4LKgrqIioHt3\n31FkjobKLEdfbIspRABWrvQwudKTSADV1Wxo11JfL8ksG9r1MLnSxSXBpjG5CsCGdj1MrvSUl0sz\nOx8cdDQcaMunej1FRRwLoGnNGp4r2BSmEAHY0K6HyZUeNrPr4pKgvjVrWLnStHIlsM8+vqNIT0yu\nAnBZUA+TKz1sZtfF5EqXtaxcaSssBPbd13cU6YnJVQA2tOthcqWHzey6mFzpqqiQnznHTc+KFUyu\nmsIUIgArV3qYXOlh5UoXkytdDUuCfO/WU1gI9OjhO4r0lHJyZYzpYYyZYIyZb4yZa4z5nYvAfGJD\nux4mV3o2bmTlShOTK11cEtTHZcGm7ejgNeoB3GutnWWM6QTga2PMGGvtIgev7QUb2vUwudJTVsbp\n1ZqYXOniGAZ9TK6alnJ9xlpbZK2dtfnXFQAWAoj0/gEuC+qpqQHat/cdRWbg0SC6mFzp4k5BXRUV\ncjYsj3cK5nTxyxhzAIBeAKa4fF1tbGjXw8qVHh5qq4vJlS4uC+pqqFqxEBHMWQqxeUlwKIC7N1ew\nIouVKz1MrvSwcqWL59zpWrkS+MEPfEeROdjMvn0ueq5gjNkRkli9ba39tKmv69u3739/nZWVhays\nLBd/vHNsaNfD5EpPaSmTK02rVwN77+07isxRUABcfbXvKDJHHPutsrOzkZ2d7eS1nCRXAAYCWGCt\nfWF7X7RlcpXO2NCuh8mVnvXruSyoadUqVlI0LV8O7Lef7ygyx9KlwEEH+Y7CrcZFn379+rX5tVyM\nYjgFwHUAzjLGzDTGzDDGnJfq6/rEZUE9TK70sHKlp7xc3kc4+kJHMimVFCZXehYvBg491HcU6Svl\nypW19ksAsTqalA3teqqrgZ139h1FZmBDu56GJUE+pOkoLpZElu8levLzgUMO8R1F+mIKEYCVKx2J\nBLBpE0cxaGFDu57Vq7kkqKmgANh/f99RZA5rpXLF5KppTK4CsKFdR0PViols+BIJmUvTubPvSDLD\nqlVsZte0fDmTK01r1wI77cSHte1hChGADe06qqqAjh19R5EZysrkXEE+NOjgTkFdBQXst9LEfqvm\n8a02AJcFdVRVsUdCC5vZdTG50sXKlS72WzWPyVUANrTrYHKlh83suthzpYtjGHQxuWoeU4gArFzp\nYHKlh83suli50pWfDxx2mO8oMsf8+UDPnr6jSG9MrgKwoV0Hkys9XBbUxYZ2PfX1MtDy4IN9R5I5\n5s4FjjrKdxTpjSlEADa062BypYfT2fVYy2UqTcuXA927c3OMlspKeXhgQ/v2MbkKwGVBHUyu9JSU\nAF26+I4iM6xdK/c1p7PryMvjkqCmBQuAww8HdnR1eF5MMbkKwIZ2HZzOrmfNGqBbN99RZIZly4AD\nDvAdReZgcqWLS4ItwxQiACtXOli50rNmjSydUPi+/RY48EDfUWSOb75hcqVp7lzg6KN9R5H+mFwF\nYEO7DiZXeoqKWLnS8u23rFxpysuTZSrSMXMmcOyxvqNIf0whArChXQeTKz1cFtTD5ErX/PnAEUf4\njiIzJBLAjBnAj3/sO5L0x+QqAJcFdVRUMLnSwuRKD5MrPcXFQE0Nd2ZqWbQI6NqVO49bgslVADa0\n6ygvl/PuKFxVVcCmTTy0WQsb2vXMmQMccwwfhrVMmwaceKLvKKKBKUQAVq50lJdzu7qGhqoV7+nw\nJZM8505TQ3JFOqZN45JgSzG5CsCGdh1MrnRwSVBPQYHME+vUyXckmWHOHDZXa8rNZeWqpZhCBGBD\nu46NG5lcaSgq4hgGLYsWsbla0+zZrFxp2bBBxl786Ee+I4kGJlcBuCyog5UrHaxc6WFypaemRsYw\ncKClji++kKpV+/a+I4kGJlcB2NCug8mVDiZXer75hsmVlpkzZb4VdxzrmDwZOOMM31FEB1OIAKxc\n6eBuQR2rV3NZUAsrV3qmTAFOOsl3FJlj0iTg9NN9RxEdTK4CsKFdBytXOgoLOQdIC5MrPVOmAL17\n+44iM6xfLwc2n3yy70iigylEADa0h89aJldaCgqYXGkoK5N7ep99fEeSGXJzWbnSMm4ccNppQIcO\nviOJDiZXAbgsGL6aGqkOtmvnO5L4Y3KlY84cOdCW7x3hW71adq/xwGYdo0cD55/vO4poYXIVgA3t\n4WPVSseGDUB9PbD77r4jib9Zs4BevXxHkRkmTpTmar5Phy+ZBD77DLjgAt+RRAtvzQCsXIWPyZWO\nhn4r3s/hmzULOO4431FkhokTgTPP9B1FZsjNlcG4Bx3kO5JoYXIVgA3t4eNOQR0FBcC++/qOIjOw\ncqUnO5vJlZbBg4GrrvIdRfTs6DuAdMSG9vCxcqWDOwV1bNokOwU50DJ8hYWyeaBnT9+RxF8yCQwZ\nAowf7zuS6GF9JgCXBcPH5EoHm9l1LFwohzVzoGX4Ro8GzjmHqwsacnKAPffkeJG24O0ZgA3t4eO5\ngjqYXOngWAA9I0eyuVrLhx8Cv/iF7yiiiSlEAFauwsfKlY4lS4ADD/QdRfx99RUHLGqorZV+q/PO\n8x1J/FVXAx98AFx3ne9IoonJVQA2tIePyZWO/HzOAtLA5ErHxInS19ali+9I4m/oUOBHPwIOOMB3\nJNHEFCIAG9rDx92C4SstlWGtPLQ5XCUlQFERG6w1fPghcOWVvqPIDK+/Dtx6q+8ooovJVQAuC4aP\nlavw5ecDhx7KezlsubnAj38M7LCD70jirbYW+PRTJlcaFiyQloILL/QdSXQxuQrAhvbwMbkKX0Ny\nReGaOBHIyvIdRfx99hlwzDE8u1HDc89J1WqnnXxHEl2ccxWAlavwlZYCu+3mO4p4Y3KlY/x4oH9/\n31HE3wcfAFdf7TuK+Fu5EvjoIyAvz3ck0eakPmOMOc8Ys8gYk2eMecDFa/rEhvbwrV/PptSwsZk9\nfCUlwLJlsixI4dmwQSpXl1/uO5L4e/554IYbZL4VtV3KKYQx5nsAXgZwLoCeAK4xxkR65Bgb2sO3\nfj2wxx6+o4i3vDxWrsI2cSJw2mnAjlwDCNU77wBnnw3stZfvSOKtpAQYOBC4917fkUSfi/rMiQDy\nrbXLrbV1AD4AcImD1/WGy4LhY3IVrmRSpoYfeaTvSOJt5Ejg3HN9RxFv1gKvvQb85je+I4m/p54C\nrrmGg4ddcPG8tQ+Awi3+eQUk4YosNrSHb906JldhWrpUll07d/YdSXwlEpJc9evnO5J4y8mRsxt5\nUHO4li0DBg2SnYKUOtVitolYOWjAAN8RxBsb2sMXsW+5SOKQRR184NXRvbvvCOLBRXK1EsCWRcQe\nm//dNqy1Dv648PXvD8yZwx1AYVmzRqYsr13rO5L4evxxOb7iz3/2HUl83X+/HNTMylV4liwBeveW\nnzl0ODwTJgA33SRVq1128R1N+kilIOTiWWAagEOMMfsbY9oBuBrAcAev6w0b2sPFnYLhmzsXOPpo\n31HEl7Uy0PLii31HEm9PPy29VkyswlNbC9x+O/DSS0ysXEq5cmWtTRhj7gIwBpKsvWmtXZhyZB6x\noT1cbGYP39y5wJ/+5DuK+Jo3T44WOv5435HE16pVwJAhnLcUtr/+VTa+8EHBLSc9V9bazwAc7uK1\n0gErV+FiM3u4ysuBwkLgiEgPRElvb78NXHcd3yfC9OSTwM03c95SmGbPlorV11/7jiR+OJ0lQDLJ\nc8LCxMpVuGbMkGNCeHRFOOrrZe7SuHG+I4mvvDypWi1a5DuS+KquBq69Fnj2WY5eCAP3XwRgchUu\nJlfhmjaNE8PDNH68nG/HGWLheegh4L772JsZpvvvl4ewX/7SdyTxxMpVgESC237DxIb2cE2bxtPs\nw/TWW8CNN/qOIr7Gj5d7eNAg35HE10cfASNGALNmcWk7LEwhArByFS5WrsI1dSorV2EpLgZGj5Yp\n1uReTc13O9d23tl3NPE0b57swPzoI84aDBOTqwCsXIWLDe3hWbMGKC3lgc1hef114IorWHkNy1/+\nAvTsyZ1rYSktBX7+c+mzOuEE39HEG5cFA7ByFS4mV+H5/HPg1FP5cBCGujoZLDx6tO9I4mnhQuDl\nl4GZM31HEk81NZJYXXwxcP31vqOJP74FB2DlKlzFxUC3br6jiKfJk4HTT/cdRTwNHSoVwWOO8R1J\n/GzaJKMtnnoK2Hdf39HETyIhCVW3bsDf/uY7mszAFCIAK1fhKiri+VVhmTwZOOMM31HETzIpH/z3\n3+87knh69FFJqm691Xck8WMtcM89QEmJbBJg4UAHlwUDJBLAjrwyoaivl3X/vfbyHUn8lJYCS5dy\nangYhg0DOnYEzj/fdyTxM2GCzA3jzjX3rAUeeUTaBSZNAtq39x1R5mAKEYCVq/CsXSvNwLy+7k2Y\nAJxyCoeHupZMykHYTz7JD3/XCgtlOfDtt/nA5Zq1wMMPy8iFCROAzp19R5RZmFwFYM9VeLgkGJ5R\no1hZCcPgwZKwcnaYWzU1wGWXybDQn/3MdzTxYq0MYh01ShIrHiGkjylEAFauwlNUxGb2MFgLfPYZ\nkyvXamqABx8E/v53Vq1csha47Tbg4IMluSJ3kknpDRw1SgayMrHyg5WrAKxchYeVq3DMmSM9QYce\n6juSeHnpJdkdmJXlO5J4eewxOTdwwgQmrS7V1QG33ALk58u15Tw2f5hcBWDlKjxr1jC5CsPo0axa\nubZyJfD008AXX/iOJF5efx147z0gJwfYZRff0cRHZSVw5ZVSGBg/nhPufWN9JgArV+Fh5Soc7Ldy\n77e/Be64Azj8cN+RxMfw4VK1+uwzoGtX39HER0kJcNZZ0nIxbBgTq3TAFCIAK1fhYXLl3urVwNy5\n8uZKbnzyCTB/vvRbkRujRwN9+kiCdcghvqOJj/nzgZNOAn76U2DgQO4WThdcFgyQSDC5CguTK/eG\nDgUuugjo0MF3JPFQViZVq7ff5jV1ZcwY4MYbJbHioeLujBwJ3HQT8MwzPNLGtbq61P57Vq4CJJNc\nFgwLdwu69+GHwFVX+Y4iHqwFbr9dzl9jE7sbEyYAv/ylLFf17u07mniwVo6xufVW4NNPmVi5VlwM\nnH12aq/BFCIAK1fhsFaGBvLsMHcKC2XXVapvBCTeeQeYPVtGL1DqRo4Err4aGDJEBtxS6mpqpAr4\n/vtAbi5w8sm+I4qX6dOluprq/crkKgArV+FYvx5o1w7YdVffkcTHhx8Cl14q15VSs2QJcO+9spOt\nY0ff0UTf++/LWIB//5vnXbpSVASceSZQXS1H2vBB1a1Bg2Rj0HPPyVmiqWAKEYCVq3AUFAD77ec7\niviwFnjzTXmKpdRUVsq08D/9CejVy3c00de/vwyyHDdOmq0pdTNnyrU87zx5qOIYC3cSCblfH38c\nyM6W94JUsaE9ACtX4WBy5VbD/KVTT/UbR9RZK7vYevUC7rrLdzTRZq2cwfjWW1JZOfBA3xHFw5Ah\nMhakf3/giit8RxMvZWXANddIA/vUqcAee7h5XSZXAVi5CgeTK7cGDAB+/WtOuE7Vs88CeXmSrPJa\ntt2mTcBvfiM9a59/Duy9t++Ioi+ZBJ54QirUY8YAxx3nO6J4ycuTzSvnnCM7Ll2OsWByFYCVq3AU\nFjK5cqW0VLa1P/us70iibeRIaV7PzWWfVSrKyoDLLwc6dQImT+aSlQtVVcCvfiXvm1OncoSNa+PH\nS8XqqafkIdU1phABWLkKBytX7rz+ujxx8VDWtps+XT68hg0D9t/fdzTRtWwZ8JOfyBmMH3/MxMqF\nlSuB008H2rcHJk5kYuXaO+8A114ry61hJFYAk6tArFyFo6CAu1tc2LQJePFF4L77fEcSXUuXSnL6\nxhucvZSK3FzZsn7HHbLDig+lqZs+XRrXL79cdq9xkK071gJ/+Qvw8MMyfy3MXaxcFgzAylU4WLly\n4/33gZ49gWOP9R1JNBUVyY6rhx8GLrnEdzTRNXSoDFz95z+BCy/0HU08DB4M3HmnVKZ//nPf0cRL\nIgH87nfSW5mTA+yzT7h/HpOrAKxcuVdTI4eL/uAHviOJtmRSeoQ45LJtSkqAn/1MJlrfeafvaKKp\nYTr4Sy+xydoVa79rXB87luNAXKuvl+/5NWukJ7Bz5/D/TCZXAVi5cm/ZMqla7cg7LiVDhsiJ9+ec\n4zuS6CktlUn2F18MPPKI72iiqa5OktKpU4GvvgJ69PAdUfTV1ckxNvPnA1OmsL/Ktbo6aVyvrJQN\nLFobV/hRF4CVK/cWLwYOOcR3FNFWXw889phUDDgyoHU2bpSlwKws2R3E69d6GzYAV14p29U//5wn\nLbhQWQn84hdSuZo4kZsBXKutlXNXk0ngk09kg4AWphABWLlyb/Fi4NBDfUcRbe+9J4de/+xnviOJ\nlrIy4IILgBNOkNEVTKxab/lyaVw/7DA5KJiJVepKSoCzzgK6dpVrysTKrfp6SVx32EH6AzUTK4DJ\nVSBWrtzLz2flKhWbNgF9+0pfBpODlisulrPYjj8eePllXru2mDZNRi38+tdSNeXSfupWrJBk9ac/\nBQYOdDu8kuQzvE8fWRL84AM/Z68yhQjAypV7XBZMzUsvAT/8ocy+oZYpKABOO012BL7wAh+Y2mLY\nMKn6vfoqcPfdTE5dKCiQEQB9+gD/93+8pq5ZC/zxjzJ9fcgQf4krn0ECsHLlHpOrtisqAv78Z9k+\nTC2zaBFw7rnAvfdKUkCtY63MrXr2WeCzz2RJlVK3fLlUUn/7W+D3v/cdTTw9/7zcs75PCmByFYCV\nK7c2bQJWrQIOOMB3JNH04IPAzTdLvws1b8YM4H/+RxLSX/3KdzTRk0xKUjp+vCT0nE3nxrffSmL1\n+9/LvCVyb/RoGROSm+vuAOa2Sim5MsY8DeAiALUAlgC4yVq70UVgPrFy5VZ+vrxBs6+g9XJzgf/8\nRyox1LzJk4ErrgD+8Q8OYWyLujpJ5L/9VnYE7rab74jiobhYxqfccw8Tq7AsWgTceKMcwZQODwSp\nphBjAPS01vYCkA/gwdRD8o+VK7fmz5eJ4tQ6tbXALbfI0sz3v+87mvQ3cqQcGfLee0ys2qKqCrj0\nUpkH9p//MLFypbxc+tauuopL1GGpqpLv/aeeAk491Xc0IqXkylo7zlqb3PyPuQBiMVKOlSu3mFy1\nzZNPylLgVVf5jiT9vf++JKIjRnBURVuUlUllZc89pYl95519RxQPmzZJon/CCcDjj/uOJr5+/3s5\nKaBPH9+RfMdlz9XNAD5w+HresHLl1vz58lRBLTdzpixtzZ7N3UTN6d9fnljHjQOOOsp3NNHTkFid\ndBJ3VbpkLXDXXdJU/eqr/D4Oy5Ah0h84Y0Z6XeNmkytjzFgA3bb8VwAsgIettf/e/DUPA6iz1r4X\nSpTKWLlya/58mSxOLdPQ9/K3vwF77+07mvTVcML9G29Ir9VBB/mOKHoaEquTT5ZdVun04RR1r74q\nGwK++ooP62EpKpLjmEaOTL/WiWaTK2vt2dv7fWPMrwBcAOCs5l6rb9++//11VlYWsrKymvtPvGDl\nyp3aWmmO5U63lnv0UTmx/YYbfEeSvqwFHngAGDVKGq95IHjrMbEKz6RJMvA3J4fT7MN0zz3SDvDj\nH7t5vezsbGRnZzt5LWOtbft/bMx5AJ4BcLq1dl0zX2tT+bM0HXmkjMs/8kjfkUTf3LlyBMHChb4j\niYaxY2V8wKxZwF57+Y4mPSUSwG9+A8yZI8lVly6+I4qeqio5xPqEE2QpkImVOyUlQK9ewJtvyqw1\nCsfIkbJBYO7c8A5jNsbAWtum745Ue65eAtAOwFgj35251to7UnxN71i5cmfmTHmjoeYVF0tiNWgQ\nE6umbNoEXH89sG6d9Fl06uQ7ouipq5MHnoMPZsXKNWuBm24Crr2WiVWYKiuBO+6Qo4PCSqxSlVJy\nZa2N5VG8ySSTK1dmzJBz3Wj7kklJrG64Qc4bo21VVwNXXinfmyNGAB06+I4oeqyVMwKTSamssLfU\nrZdfBtasAT76yHck8fb3v8t5l+n8XskJ7QESCb7puDJjBnDRRb6jSH9PPAFs3Mjt2k2pqAAuvhjo\n3h146y0OpG2rfv1k2OL48byGri1bJtc3J8fPQcGZYvVq4MUXga+/9h3J9jG5CsDKlRvJpIwSOO44\n35GktxEjgAEDgOnT+YEXpLRUhjAedRTw2mv83myrjz6SZZRp0/yeuRZH1kof4B/+wM07YevbV3ZT\np/txakyuArBy5caSJXK+k+8zntJZfr68UXz6qVRlaGtr18qOtqwsmVTP/qC2mTNHPvw/+wzo1q35\nr6fWefe6jJRWAAATLklEQVRdWQ687z7fkcTb8uWy2Sw/33ckzWNyFYCVKzemT2e/1fZUVACXXSZL\nCSef7Dua9LN2rSRVl10my6VMrNqmtFSOtXnhBdkdSG5t3Ajcfz8wfDgrz2F7+mnpGYzCAzuTqwCs\nXLmRk8OkoSn19XKsTe/eUlGgra1bJ8fYXHaZ9KNR21gL3Hqr9D1ee63vaOLpL38BzjvP3awlCrZ6\ntRxzFZWxPkyuArBy5UZODt/Qg1gr24gTCR6LEaS0VGYwnX8+G/xT9eabQF4e8PbbviOJp4ICOaZq\nzhzfkcTfiy8C110XnWXtlIaItuoPitAQ0S5d5A2JwwnbrqJCvgnWrwfat/cdTXp56ilpLp40idOb\nG9uwQRKrU08FnnmGiWcqvvlGruOkSRyIHJabb5bTAZ580nck8VZbC+y3n5zGoLlhwOcQ0Vhi5Sp1\nU6fK8FAmVlsbNEh2Bn71FROrxqqrgQsvBE48kYlVqpJJ6U159FEmVmFZtkw2oixe7DuS+Bs6FDj2\n2GjtxGRnUQD2XKUuJwc45RTfUaSXceOk8XXUKB7I3FgiAfzyl0CPHlL+Z2KVmjfflGn2d97pO5L4\n+utfpV9y9919RxJ/r74qrRRRwspVAFauUvfll8Btt/mOIn3Mni39ZzyzclvWyhlhpaXA6NF8sEnV\n6tXAQw/JoFC+j4Vj5UpgyBBZeqVwzZsnIxguvNB3JK3Dt7EArFylJpEAcnO5U7BBYaG8Mbz0EnD6\n6b6jST9//av0UgwbxmVkF/74R6BPH+CYY3xHEl+vvSYPS3vu6TuS+Hv/fbnWO0asFBSxcHWwcpWa\nmTOlyTMquzrCVFYmu97uvltGL9DWhg0DXnlFkvHOnX1HE33TpgETJrCiEqbaWumbzM72HUn8WQt8\n8IFU/KOGyVUAVq5SM26czCjKdLW1MqfprLM4uTnI/Pkyg2nUKGCffXxHE33Wyn3Wrx/QqZPvaOJr\n6FDg6KOBI47wHUn8TZ0qg1l79fIdSesxhWjEWkmuWLlqu7FjmVwlk8AttwC77QY89xwbtBtrmBr+\nzDMcvujKyJFyXW+6yXck8fbqq9wooOX994Grr47m+yfnXDWSSMiJ5omE70iiqaoK6NpVmmozedTA\ngw/KfKHx44GOHX1Hk16SSeDii4GDD5YjWSh11gInnST9Vldc4Tua+MrPB047DVixIno9QFFjrcy2\nGjMG+OEP/cTAOVcO1dfzmyYVX34pJdxMTqz695choTk5TKyCvPiinBs4bJjvSOJjzBigslKWoSk8\n774rvZP8jAjfvHmyJBjV5VfeIo0kEvzGScXYsTJhO1MNHy5HtnzxBXcSBZkxQybUT5nCQ25deuIJ\n4JFH2CsaJmsluXr3Xd+RZIbRo2UzUBSXBAH2XG2jvp79VqkYNQo491zfUfgxdar0WX36qSx50daq\nq2VL9YsvAgcd5Dua+Jg6VeYu/eIXviOJt2nT5Gf2COpoSK6iislVI6xctd2SJUBJiRxfkmmWLAEu\nuQQYODAz//4t0bevHGFxzTW+I4mXl1+W6dV8KAzXBx/Iw0FUKylRsnEjMH06cOaZviNpO6YRjbBy\n1Xb//rcMy8y0pYm1a+UJ67HHgIsu8h1Nepo+HfjXv4C5c31HEi/FxfJ99/zzviOJvxEjJMGi8I0f\nD/TuDeyyi+9I2i7DPgabx8pV2w0fLrvAMkl1tfydL79czhmjbdXVyXLpM8/ITlJyZ8AA2R24xx6+\nI4m3/HygogI47jjfkWSGceOAc87xHUVqmFw1wt2CbVNaKtWJTJpvlUwC118PHHigNGlTsFdeAbp3\nB667znck8WKtVAP79PEdSfyNHAlccAGXBLV88UX0jwpjGtEIlwXbZsQIICsL2Hln35Ho+d//lWWZ\nsWMzbym0pUpKJPGcPJkfTK5NnSrXlD1+4Rs5UvraKHxlZcDSpcDxx/uOJDVMrhrhsmDbfPihTNLN\nFP37y67AnBweNrw9ffvKfeFrCGCcvfOOVE6ZtIarokLOvvz4Y9+RZIacHNmRGfVRLUwjGmHlqvXW\nrwc+/1yOKsgEo0Z9N8uqSxff0aSvBQuAwYOBhQt9RxI/dXXyQJOb6zuS+MvOlupgJg9G1vTFFzIF\nP+q4mNEIK1et9/HH0nyYCW8+M2cCN94of2fOstq+P/1JjmNhAureuHHAIYdwXpiGSZOk5YF0TJki\nOwWjjslVI6xctV7D4Zpxt3q17Ax89VXg5JN9R5Pe5syRo5DYpxKO4cOBn//cdxSZYdKk6DdXR4W1\ncorDCSf4jiR1rNE0wt2CrbN6tXwzXHCB70jCVVsr4xZ+/Wvgyit9R5P+Hn8cuP/+zNrgoMVa2UAy\ndqzvSOKvvFyWt086yXckmWHpUlkBicPIFqYRjXBZsHWGDJHBmXE+oNha4M47gb33lvPbaPsWLpQe\nvEGDfEcST7NnyyaKww/3HUn85eTIrrUOHXxHkhmmT49H1QpgcrUNLgu2zqBB8Z/x9Mor0gfw1Vcc\nudASL7wA3H47q1ZhGTFCHmi4SzB8ubnAT37iO4rM8fXX8Umu+FHRCCtXLTd7tsx5ivPg0IkTgSee\nkLELnTr5jib9rVsnu9huv913JPHVcMwUhW/aNB7UrGnGjOjPt2rA5KoRVq5a7s03gZtuiu/1WrVK\nDmp9913uymqpAQOASy8FunXzHUk8rV8vy65x2Kqe7qxlcqVt/nzg6KN9R+EGazSNsHLVMjU1wHvv\nyZtPHNXXS2J1xx3xrsy5lEwCr73GYYthmjxZlqnatfMdSfwVFsrP++7rN45MsX49UFkJ9OjhOxI3\nWLlqhLsFW+bTT4FeveRcvTjq108mBD/0kO9IomPiRGD33eNT1k9H2dmcuaRl2jQZHsreNh0LFgBH\nHhmf6800ohEuC7bMG28At9ziO4pwjBkDDBwo6/+8F1run/+UZWIKT3a2VAcpfDNnxqe5Ogrmzwd6\n9vQdhTusXDXCZcHmffONDImM4xDDoiKZwP7OO+wbao0NG2QX27XX+o4kvkpLZQ4QP/B1zJ0bn/6f\nKGioXMWFk+TKGHOfMSZpjNnDxev5xMpV8155BejTJ36zX6wFbr0VuPlm4MwzfUcTLUOGAD/9KbDn\nnr4jia8pUySxivqBtlExbx5w1FG+o8gccatcpVyjMcb0AHA2gOWph+MfK1fbV14uVZ3Zs31H4t7A\ngdLEOnSo70iiZ+jQ+C4Tp4spUzgpXEtlpZw+wfND9SxaBBxxhO8o3HFRuXoOwP0OXictsHK1fYMG\nAWedFb8dNMuWAQ88IH8/7sRqnbIymWR9/vm+I4k3Jld65s+XD3o+aOuoqQFKSuL1uZJScmWMuRhA\nobV2rqN4vONuwaZZC7z8MnDXXb4jcSuZlEbsBx5gj0VbjBghy6gcshoea4GpU5lcaeGSoK5vvwX2\n2y9ehY1m0whjzFgAW7b2GgAWwCMAHoIsCW75e03q27fvf3+dlZWFrDTcU8xlwaaNHy/X5owzfEfi\n1j//CVRVAffe6zuSaPr4Y+Cyy3xHEW9Ll8r5nT/4ge9IMsO8efHq/0l3S5akx6Dm7OxsZGdnO3mt\nZtMIa+3ZQf/eGHMUgAMAzDbGGAA9AHxtjDnRWlsc9N9smVylKy4LNu2FF6RqFZc5JIAc3/Pgg8B/\n/sP/721RVQWMGyejOSg8s2ZxfpimvLz4PUSms6VL06O/rXHRp1+/fm1+rTbXaKy18wB0b/hnY8wy\nAMdba0vbHE0aYOUq2IIFsiwxeLDvSNz6wx+A668HjjvOdyTR9PnnwLHHAntEfp9wepszBzjmGN9R\nZI7Fi4FDDvEdReZYujQ9KlcuuUwjLJpZFowCVq6CPfOMVK06dvQdiTsTJshQxgULfEcSXePG8Xgg\nDXPmcIaYlkRCeoDi9mGfzpYsAU4/3XcUbjkbImqtPchau97V6/nCytW2Vq0Chg2Tc/bior5eksUX\nXmAjdirGj5f5VhQuVq70FBQAXbvG60Ey3aXLsqBLnNDeCHcLbuvFF4HrrgO6dPEdiTsDBgDduwOX\nXuo7kuhat06eOLmDLVwbN8rJAVym0sElQV3WyiicuJ1TyzSiES4Lbq28XJqVp03zHYk7GzfKwcyj\nR8erOV/bxInAqadyYnjY5s2TY0H4vqSDyZWu0lJ5D9l1V9+RuMXKVSNcFtzagAHSUxOnp4o//xk4\n7zw2sadq3DguCWpYuDBeZ66lOyZXulauBPbZx3cU7jGNaISVq+9s2gQ8/7z0W8XF6tXAP/4hPSyU\nmkmTgNtu8x1F/OXlAYcf7juKzLF4MXDKKb6jyBwrVsQzuWLlqhFWrr4zaBDwwx/KYbFx8fTTwA03\nAD16+I4k2kpL5U2RE+3Dl5cHHHaY7ygyR0GBTAsnHStXxvP9mGlEI/X1QIcOvqPwr75els/eest3\nJO4UFcnfZ94835FE39SpwI9+xAcRDXl5wKGH+o4ic6xYEa8z7tJdXJcFWblqhLsFxXvvydPbqaf6\njsSdp5+WgaE8QiR1ublA796+o4i/REK2qbMHSEd1tWx42Wsv35FkDiZXGSKRYM9VIgE89RTw6KO+\nI3GnuBj417/kcGZKHZMrHYWFwJ57Arvs4juSzNDQ//M9fjKqYXKVIerquLV8yBB5Qz/zTN+RuPPa\na8AVV7Bq5YK1six44om+I4k/9lvpKizkkqC2uCZXXABrJNOTq2QSePJJ4O9/j88MqNpaoH9/GR1A\nqVuxQr5H9t7bdyTxl5/PfitN7LfSx92CGSLTk6tPPpFjH84913ck7gweLLvaevb0HUk8zJoF9Orl\nO4rMsHw5cMABvqPIHKxc6aqpiW+PG5OrRurqMreh3VqpWj36aHyqVtYCzz0H3HOP70jiY/ZsJlda\nli/nWABNhYXxHAuQrtasAbp1i2ePWwz/Sqmpr8/cytXIkbIseNFFviNx58svgcpKmchObsyaBRx7\nrO8oMkNBAbD//r6jyBxcFtS1dm08q1YAk6ttZOqyoLXAE08AjzwSn6oVIMf33HZbPJ+MfGHlSg8r\nV7pWrGDlSlNJCZOrjBGn5Co7O7vFXzt2LFBRAVx2WXjxaCsvB4YPl9lWWlpzzaOoslJ296RTk3Vc\nr3ltrXz4pOMO17he84ZlqnQUx2u+dq3sTI8jJleNxKnnqqXfjA1Vq4cfjleFZ/BgICtL98kojm+A\nW8rLAw4+OL2+R+J6zVeskMQqHefuxfGaJ5PpXUmJ4zVP5+udqhh9lLoRp8pVS02aJE9sV13lOxK3\nBg4Ebr7ZdxTx8s03PERYC/utdJWWArvuCrRr5zuSzMHKVQbJxIb2J58EHnooPZ+Q22rpUpkRxEZ2\nt5hc6eEBwrqKi4GuXX1HkVniXLky1lqdP8gYnT+IiIiIyAFrbZu2eKklV0RERESZgMuCRERERA4x\nuSIiIiJyyHlyZYw5zxizyBiTZ4x5oImvedEYk2+MmWWM4TjCFDV3zY0xZxhjyowxMzb/eMRHnHFh\njHnTGLPGGDNnO1/De9yh5q4573H3jDE9jDETjDHzjTFzjTG/a+LreK870pJrznvdLWNMe2PMFGPM\nzM3X/LEmvq5197m11tkPSLK2GMD+AHYCMAvAEY2+5nwAIzf/+iQAuS5jyLQfLbzmZwAY7jvWuPwA\ncCqAXgDmNPH7vMf1rznvcffXvDuAXpt/3QnAN3w/T4trznvd/XXfefPPOwDIBXBio99v9X3uunJ1\nIoB8a+1ya20dgA8AXNLoay4BMAgArLVTAHQ2xqTpTNxIaMk1B4AYHWrjl7X2CwCl2/kS3uOOteCa\nA7zHnbLWFllrZ23+dQWAhQD2afRlvNcdauE1B3ivO2Wtrdr8y/YAdgTQeKdfq+9z18nVPgAKt/jn\nFdj2xmj8NSsDvoZariXXHABO3lzOHGmMOVIntIzFe9wP3uMhMcYcAKkcTmn0W7zXQ7Kdaw7wXnfK\nGPM9Y8xMAEUAxlprpzX6klbf52l0iAWF6GsA+1lrq4wx5wP4BMBhnmMicon3eEiMMZ0ADAVw9+Zq\nCoWsmWvOe90xa20SwHHGmO8D+MQYc6S1dkEqr+m6crUSwJYzhXts/neNv2bfZr6GWq7Za26trWgo\ne1prRwPYyRizh16IGYf3uDLe4+EwxuwI+ZB/21r7acCX8F53rLlrzns9PNbajQAmAmh8tker73PX\nydU0AIcYY/Y3xrQDcDWA4Y2+ZjiAGwDAGNMbQJm1do3jODJJs9d8y7VhY8yJkOGx63XDjB2Dpvse\neI+Ho8lrzns8NAMBLLDWvtDE7/Ned2+715z3ulvGmD2NMZ03/7ojgLMBLGr0Za2+z50uC1prE8aY\nuwCMgSRub1prFxpjbpPftq9ba0cZYy4wxiwGUAngJpcxZJqWXHMAVxhjbgdQB6AaQMyOaNZljHkP\nQBaALsaYAgCPAWgH3uOhae6ag/e4c8aYUwBcB2Du5n4UC+AhyM5k3ushaMk1B+911/YG8JYx5nuQ\nz9APN9/XKeUtPP6GiIiIyCFOaCciIiJyiMkVERERkUNMroiIiIgcYnJFRERE5BCTKyIiIiKHmFwR\nEREROcTkioiIiMghJldEREREDv0/MYVnKOajc4AAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f6bb566a860>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(10,4))\n",
    "x = linspace(0, 3, 1000)\n",
    "y = f(x)\n",
    "mask = where(abs(y) > 50)\n",
    "x[mask] = y[mask] = NaN # get rid of vertical line when the function flip sign\n",
    "ax.plot(x, y)\n",
    "ax.plot([0, 3], [0, 0], 'k')\n",
    "ax.set_ylim(-5,5);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.23743014])"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "optimize.fsolve(f, 0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.71286972])"
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "optimize.fsolve(f, 0.6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.18990285])"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "optimize.fsolve(f, 1.1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Interpolation\n",
    "\n",
    "Interpolation is simple and convenient in scipy: The `interp1d` function, when given arrays describing X and Y data, returns and object that behaves like a function that can be called for an arbitrary value of x (in the range covered by X), and it returns the corresponding interpolated y value:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.interpolate import *"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [],
   "source": [
    "def f(x):\n",
    "    return sin(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [],
   "source": [
    "n = arange(0, 10)  \n",
    "x = linspace(0, 9, 100)\n",
    "\n",
    "y_meas = f(n) + 0.1 * randn(len(n)) # simulate measurement with noise\n",
    "y_real = f(x)\n",
    "\n",
    "linear_interpolation = interp1d(n, y_meas)\n",
    "y_interp1 = linear_interpolation(x)\n",
    "\n",
    "cubic_interpolation = interp1d(n, y_meas, kind='cubic')\n",
    "y_interp2 = cubic_interpolation(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f6bb5d0a400>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(10,4))\n",
    "ax.plot(n, y_meas, 'bs', label='noisy data')\n",
    "ax.plot(x, y_real, 'k', lw=2, label='true function')\n",
    "ax.plot(x, y_interp1, 'r', label='linear interp')\n",
    "ax.plot(x, y_interp2, 'g', label='cubic interp')\n",
    "ax.legend(loc=3);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Statistics\n",
    "\n",
    "The `scipy.stats` module contains a large number of statistical distributions, statistical functions and tests. For a complete documentation of its features, see http://docs.scipy.org/doc/scipy/reference/stats.html.\n",
    "\n",
    "There is also a very powerful python package for statistical modelling called statsmodels. See http://statsmodels.sourceforge.net for more details."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy import stats"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [],
   "source": [
    "# create a (discreet) random variable with poissionian distribution\n",
    "\n",
    "X = stats.poisson(3.5) # photon distribution for a coherent state with n=3.5 photons"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f6bb002fe10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n = arange(0,15)\n",
    "\n",
    "fig, axes = plt.subplots(3,1, sharex=True)\n",
    "\n",
    "# plot the probability mass function (PMF)\n",
    "axes[0].step(n, X.pmf(n))\n",
    "\n",
    "# plot the commulative distribution function (CDF)\n",
    "axes[1].step(n, X.cdf(n))\n",
    "\n",
    "# plot histogram of 1000 random realizations of the stochastic variable X\n",
    "axes[2].hist(X.rvs(size=1000));"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [],
   "source": [
    "# create a (continous) random variable with normal distribution\n",
    "Y = stats.norm()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nRDLu/wGZ7jFzrVgFbAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f6babedd8d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = linspace(-5,5,100)\n",
    "\n",
    "fig, axes = plt.subplots(3,1, sharex=True)\n",
    "\n",
    "# plot the probability distribution function (PDF)\n",
    "axes[0].plot(x, Y.pdf(x))\n",
    "\n",
    "# plot the commulative distributin function (CDF)\n",
    "axes[1].plot(x, Y.cdf(x));\n",
    "\n",
    "# plot histogram of 1000 random realizations of the stochastic variable Y\n",
    "axes[2].hist(Y.rvs(size=1000), bins=50);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Statistics:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3.5, 1.8708286933869707, 3.5)"
      ]
     },
     "execution_count": 124,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.mean(), X.std(), X.var() # poission distribution"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.0, 1.0, 1.0)"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Y.mean(), Y.std(), Y.var() # normal distribution"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Statistical tests"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Test if two sets of (independent) random data comes from the same distribution:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "t-statistic = -0.345894922917\n",
      "p-value = 0.729458100855\n"
     ]
    }
   ],
   "source": [
    "t_statistic, p_value = stats.ttest_ind(X.rvs(size=1000), X.rvs(size=1000))\n",
    "\n",
    "print (\"t-statistic =\", t_statistic)\n",
    "print (\"p-value =\", p_value)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Since the p value is very large we cannot reject the hypothesis that the two sets of random data have *different* means."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To test if the mean of a single sample of data has mean 0.1 (the true mean is 0.0):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Ttest_1sampResult(statistic=-3.0072194689828877, pvalue=0.0027024849461473521)"
      ]
     },
     "execution_count": 127,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stats.ttest_1samp(Y.rvs(size=1000), 0.1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Low p-value means that we can reject the hypothesis that the mean of Y is 0.1."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0"
      ]
     },
     "execution_count": 128,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Y.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Ttest_1sampResult(statistic=-0.24139905294068001, pvalue=0.80929538456613681)"
      ]
     },
     "execution_count": 129,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stats.ttest_1samp(Y.rvs(size=1000), Y.mean())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Further reading\n",
    "\n",
    "* http://www.scipy.org - The official web page for the SciPy project.\n",
    "* http://docs.scipy.org/doc/scipy/reference/tutorial/index.html - A tutorial on how to get started using SciPy. \n",
    "* https://github.com/scipy/scipy/ - The SciPy source code. \n"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  },
  "toc": {
   "colors": {
    "hover_highlight": "#DAA520",
    "running_highlight": "#FF0000",
    "selected_highlight": "#FFD700"
   },
   "moveMenuLeft": true,
   "nav_menu": {
    "height": "412px",
    "width": "252px"
   },
   "navigate_menu": true,
   "number_sections": true,
   "sideBar": true,
   "threshold": 4,
   "toc_cell": false,
   "toc_section_display": "block",
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
